在视图控制器之间传递数据 – 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,你可以看看这里:
在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了一个单例来在视图控制器之间传递数据。 到目前为止我还没有遇到任何问题(敲木头)。