在视图控制器之间传递数据 - iOS Xcode - 啥是好方法?

Posted

技术标签:

【中文标题】在视图控制器之间传递数据 - iOS Xcode - 啥是好方法?【英文标题】:Passing data between view controllers - iOS Xcode - what's a good way?在视图控制器之间传递数据 - iOS Xcode - 什么是好方法? 【发布时间】:2012-07-09 09:37:33 【问题描述】:

好的,我会尽量让这件事变得简单(当我试图问这个问题时,我似乎在 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);
    

如您所见,我尝试了几种不同的方法,但无法提出可行的解决方案:-l

【问题讨论】:

如果您使用故事板,为什么不使用 segue? 【参考方案1】:

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

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

在 IB 中创建 segue 非常简单。设置完成后,您可以实现-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 并配置您的目标视图控制器。所以你会得到类似下面的东西。

-(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;
    

【讨论】:

【参考方案2】:

您不应该在这两个 ViewController 之间保持双向的强引用。例如,您可以做的是在您的ViewControllerWelcome 中声明一个协议,其中包含一个委托。您可以让ViewControllerHome 实例化另一个控制器,然后成为它的代表,一旦用户完成输入用户名就会得到通知。

@protocol ViewControllerWelcomeDelegate <NSObject>    
- (void) userNameEntered:(NSString *)userName;    
@end

@interface ViewControllerWelcome : UIViewController
@property (nonatomic, weak) id <ViewControllerWelcomeDelegate> delegate;
...
@end

在您的@实现中:

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField

   [theTextField resignFirstResponder];
   [delegate userNameEntered:theTextField.text];

   return YES;

【讨论】:

【参考方案3】:

如果你有一个 .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 部分,我建议您只阅读第 2 部分。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于在视图控制器之间传递数据 - iOS Xcode - 啥是好方法?的主要内容,如果未能解决你的问题,请参考以下文章

xcode/ios:以编程方式启动模态视图控制器时如何传递数据

在视图控制器 ios 7 之间传递数据

xcode/ios:以编程方式推送视图控制器并传递行信息

在 xamarin.ios 中的视图控制器之间传递数据

在视图控制器之间传递 iOS 10 Segue 中的数据 [重复]

如何在视图控制器之间传递数据而不在 ios 中使用 segue?