在视图控制器之间传递数据 – iOS Xcode – 什么是好方法?

好吧,我会试着尽可能简单(当我试着问这个问题时,我似乎在chat.stackoveflow.com上运行)。 我想将文本从一个视图控制器中的文本传递给另一个视图控制器。

我应该使用一个Model类,并将textfield.text存储在Model。[h / m]文件中,然后让第二个视图控制器访问存储在模型中的数据?

基本上这是我所拥有的,

ViewControllerWelcome.h

@interface ViewControllerWelcome : UIViewController { } @property (weak, nonatomic) IBOutlet UITextField *textFieldUsername; 

ViewControllerWelcome.m

 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; ViewControllerHome *home = (ViewControllerHome *)[storyboard instantiateViewControllerWithIdentifier:@"Home"]; NSString *username = _textFieldUsername.text; home.lblUSERNAME.text=username; [self presentModalViewController:home animated:YES]; 

ViewControllerHome.h

 @interface ViewControllerHome : UIViewController { NSString *username; UILabel *lblUSERNAME; } @property (weak, nonatomic) IBOutlet UILabel *lblUSERNAME; 

ViewControllerHome.m

 - (void)changeUSERNAME { // get username from welcome tf ViewControllerWelcome *welcome = [[ViewControllerWelcome alloc] init]; welcome.username = [self lblUSERNAME.text]; // _lblUSERNAME.text = welcome._textFieldUsername.text; //welcome.textFieldUsername.text = _username; // username = welcome.textFieldUsername.text; NSLog(@"username = %@",username); // welcome.textFieldUsername.text = _lblUSERNAME.text; // NSLog(@"username = %@",welcome.textFieldUsername.text); } 

正如你所看到的,我尝试了几个不同的东西,但不能提出一个可行的解决scheme:-l

由于您使用的是Storyboard,因此使用Segues在ViewController之间执行转换更有意义。 如果你不熟悉segues,你可以看看这里:

http://developer.apple.com/library/IOs/#featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomSegues/CreatingCustomSegues.html

在IB中创build一个segue非常简单。 一旦你设置了你的实现
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender并configuration你的目标视图控制器。 所以你会有如下的东西。

 -(void)prepareForSegue(UIStoryboardSegue *)segue sender:(id)sender{ // Assume you have a viewHomeSegue defined that has the name of the segue you want to perform NSString * segueIdentifier = [segue identifier]; if([segueIdentifier isEqualToString:viewHomeSegue]){ ViewControllerHome * homeController = (ViewControllerHome *)[segue destinationViewController]; homeController.lblUSERNAME.text = _textFieldUsername.text; } } 

您不应该在两个方向上保持这两个ViewController之间的强引用。 例如,您可以执行的操作是在您的ViewControllerWelcome使用委托在其中声明一个协议。 您可以让ViewControllerHome实例化另一个控制器,然后成为其委托,一旦用户完成input用户名就会得到通知。

 @protocol ViewControllerWelcomeDelegate <NSObject> - (void) userNameEntered:(NSString *)userName; @end @interface ViewControllerWelcome : UIViewController @property (nonatomic, weak) id <ViewControllerWelcomeDelegate> delegate; ... @end 

在你的@implementation中:

 - (BOOL)textFieldShouldReturn:(UITextField *)theTextField { [theTextField resignFirstResponder]; [delegate userNameEntered:theTextField.text]; return YES; } 

如果你有一个.storyboard文件,你可以像使用界面生成器一样在那里布置你的视图。

这些文件真的帮了我第一次:

第1部分: http : //www.raywenderlich.com/5138/beginning-storyboards-in-ios-5-part-1

第2部分: http : //www.raywenderlich.com/5191/beginning-storyboards-in-ios-5-part-2

如果你只想看看segues部分,我build议你只阅读第2部分。

我用另外一个关于SO的问题来提炼这个问题。基本上,我创build了一个单例来在视图控制器之间传递数据。 到目前为止我还没有遇到任何问题(敲木头)。