在同一视图控制器类之间传递数据

时间:2016-08-14 10:45:19

标签: ios segue

我开始学习iOS开发(使用Objective-C),我遇到了以下问题。

到目前为止我做了什么:

我想将注册过程划分为多个视图控制器。例如:

  • 查看控制器1包含fnamelname的字段。
  • 视图控制器2有一个email字段。
  • 视图控制器3有一个password字段和一个"保存"按钮。

现在,我创建了一个名为UIViewController的新RegistrationViewController类文件,并将该类分配给上面的所有视图控制器,以便我可以在一个文件中编写所有与注册相关的代码。

我使用push segue从当前视图控制器进入下一个视图控制器。

问题

当我点击"保存"我最后一个视图控制器上的按钮,我无法获取fnamelnameemail的值。

为什么会这样?我的意思是,我在同一个档案中。不应该为这些属性存储值吗?

2 个答案:

答案 0 :(得分:1)

  

我使用push segue从viewcontoller转到下一个viewcontroller。

推送segue推送一个全新的视图控制器实例,这意味着当前位于顶部的视图控制器本身只会设置值,而在其所有前驱中设置的值将为nil

您不应该依赖于在视图控制器的字段中存储值。相反,您应该在模型类的共享实例上设置它们,如Model-View-Controller设计模式所示:

class Model {
    static let sharedInstance = Model()
    var fName : String
    var lName : String
    ...
}

当您检测到下一个视图控制器即将打开时,将当前累积的状态存储在共享模型对象中:

Model.sharedInstance.fName = self.fName
Model.sharedInstance.fName = self.lName
...

答案 1 :(得分:1)

仅仅因为数据在"相同的文件中#34;在运行时对应用程序没有任何意义。您仍在创建RegistrationViewController课程的多个单独实例。因此,您需要在这些单独的实例之间传递数据,就像对完全不同的类一样。

由于您使用的是故事板和分段,因此方法-prepareForSegue:sender:是一个值得研究的好方法。

为了记录,我同意@ dasblinkenlight建议将这些数据存储在模型对象而不是单个字段中,但不同意使用"共享实例"如果你不必要。传递模型对象的示例如下所示:

<强> User.h

@property (nonatomic, strong) NSString *fname;
@property (nonatomic, strong) NSString *lname;
@property (nonatomic, strong) NSString *email;

<强> RegistrationViewController.h

@property (nonatomic, strong) User *user;

<强> RegistrationViewController.m

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    RegistrationViewController *nextViewController = (RegistrationViewController *)segue.destinationViewController;
    nextViewController.user = self.user;
}

- (IBAction)doSaveAction:(id)sender {
    NSLog("email: %@", self.user.email;
}