2013-03-04 51 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