2013-03-04 65 views
0

3个之间的NSString值您好所有我有很多路过的观点之间的值的麻烦,Xcode的麻烦路过的观点

我有3文本框名姓电子邮件StartViewController我想将它们的值传递给视图控制器我已经尝试了一些不同的东西,但没有我这样做似乎工作我已经试过这样: http://highscoreapps.blogspot.com/2012/05/passing-data-between-view-controllers.html http://www.theappcodeblog.com/2011/04/15/passing-data-between-views-tutorial-using-a-protocol-delegate-in-your-iphone-app/

但我似乎无法得到任何工作。 下面是一些我的代码至今:

在StartViewControler.h

@protocol DataPassingControllerDelegate <NSObject> 

-(void)passDataMethod:(NSString *)TextFirstName Data2:(NSString *)TextLastName Data3:(NSString *)TextEmail; 

@property(nonatomic,retain) IBOutlet UITextField *uTextFirstName; 
@property(nonatomic,retain) IBOutlet UITextField *uTextLastName; 
@property(nonatomic,retain) IBOutlet UITextField *uTextEmail; 

@property (nonatomic, strong) NSString *sTextFirstName; 
@property (nonatomic, strong) NSString *sTextLastName; 
@property (nonatomic, strong) NSString *sTextEmail; 

@property (nonatomic, unsafe_unretained) id<DataPassingControllerDelegate> delegate; 
在StartViewController.M

-(IBAction)ButtonTakeSurvey:(id)sender{ 
self.sTextFirstName = uTextFirstName.text; 
self.sTextLastName = uTextLastName.text; 
self.sTextEmail = uTextEmail.text; 

[self.delegate passDataMethod:sTextFirstName Data2:sTextLastName Data3:sTextEmail]; 

ViewController *myView1 = [[ViewController alloc]initWithNibName:@"ViewController" bundle:nil]; 
[self.view addSubview:myView1.view]; 
} 

在ViewController.HI添加 #进口 “StartViewController.h”

@interface ViewController : UIViewController <DataPassingControllerDelegate> 

我该如何获得firstNa me LastName电子邮件在ViewController.m我希望它填充3我有onload的局部变量。

谢谢!

+0

您建立可寻址性。 – 2013-03-04 17:41:16

回答

2

我通常使用一个单独的类来处理ViewControllers之间的通信。 Singleton模式可以让您从控制器本身分离数据。以下是我使用的代码版本。

DataManager.h

#import <Foundation/Foundation.h> 

@interface DataManager : NSObject 

+(DataManager*)sharedInstance; 
-(void) setObject:(id)anObject forKey:(id<NSCopying>)aKey; 
-(id) objectForKey:(id)aKey; 
-(void) removeAllObjects; 
@end 

DataManager.m

#import "DataManager.h" 

@implementation DataManager 

static DataManager *sharedInstance; 
static NSMutableDictionary* dictionary; 

- (id)init { 
    self = [super init]; 
    if (self) { 
     dictionary = [[NSMutableDictionary alloc] initWithCapacity:0]; 
    } 
    return self; 
} 


+ (DataManager *) sharedInstance 
{ 
    @synchronized(self) 
    { 
     if (sharedInstance == NULL) 
     { 
      sharedInstance = [[DataManager alloc] init]; 
     } 
    } 

    return sharedInstance; 
} 


-(void) setObject:(id)anObject forKey:(id<NSCopying>)aKey 
{ 
    [dictionary setObject:anObject forKey:aKey]; 
} 

-(id) objectForKey:(id)aKey 
{ 
    return [dictionary objectForKey:aKey]; 
} 

-(void) removeAllObjects 
{ 
    [dictionary removeAllObjects]; 
} 

@end 

为了使用它,你需要做的就是在第一个视图控制器,得到sharedInstance,推动之前的设置值(或者在模态VC的情况下呈现ViewController)。

DataManager* dm = [DataManager sharedInstance] 
NSString* firstName = (NSString*)[dm objectForKey:@"firstName"]; 
NSString* lastName = (NSString*)[dm objectForKey:@"lastName"]; 
NSString* email = (NSString*)[dm objectForKey:@"email"]; 
//do stuff with the values. 

如果您想了解更多关于单身(我想:

DataManager* dm = [DataManager sharedInstance] 
[dm removeAllObjects]; 
[dm setObject:firstNameString forKey:@"firstName"]; 
[dm setObject:lastNameString forKey:@"lastName"]; 
[dm setObject:emailString forKey:@"email"]; 
在viewDidLoad中(或viewWillAppear中或其他)的第二视图控制器,你可以从单获取值一样

然后如果你目前不熟悉该模式,推荐它)维基百科的文章相当出色,并且有很多OO设计网站更详细地讨论它。

+0

这很好,谢谢你! – user1221399 2013-03-04 18:40:28

0

我会建议从您的控制器分离数据模型。有很多方法可以做到这一点,但一个简单的方法是创建一个“用户配置文件”类作为单例(在应用程序中共享实例)并将数据存储在那里。这样,每个需要这些数据的控制器都可以自己访问它。

+0

它的一个小应用程序只有2个视图我想只将值从一个传递到下一个,然后它将发送到Web服务,并再也不会使用。我现在知道你在说什么了。 – user1221399 2013-03-04 17:57:33

0

它看起来对我来说,所有你需要做的就是添加passDataMethod您ViewController.m:

-(void)passDataMethod:(NSString *)TextFirstName Data2:(NSString *)TextLastName Data3:(NSString *)TextEmail 
{ 
    NSString *myLocalVar1 = [NSString stringWithString:TextFirstName]; 
    NSString *myLocalVar2 = [NSString stringWithString:TextLastName]; 
    NSString *myLocalVar3 = [NSString stringWithString:TextEmail]; 

    // Do something useful with myLocalVar1, 2, and 3 here 
} 
+0

我试过这个: 'code' NSString * sFirst; NSString * sLast; NSString * sEmail; (NSString *)TextFirstName Data2:(NSString *)TextLastName Data3:(NSString *)TextEmail {0} {sFirst = [NSString stringWithString:TextFirstName]; sLast = [NSString stringWithString:TextLastName]; sEmail = [NSString stringWithString:TextEmail]; } 'code' 但是,当我设置断点时,它不会打到它们,所以我不认为它的工作。 – user1221399 2013-03-04 18:06:45

+0

当你打'这应该叫[self.delegate passDataMethod:sTextFirstName数据2:sTextLastName数据3:sTextEmail]'你StartViewController.m。你确定你在StartViewController.m中点击那条线吗? – GeneralMike 2013-03-04 18:13:04

+0

是的,它是在startviewcontoller而不是在viewController中触发它,所以viewcontroller变量永远不会被填充。 – user1221399 2013-03-04 18:22:28