我开始学习iOS开发(使用Objective-C),我遇到了以下问题。
到目前为止我做了什么:
我想将注册过程划分为多个视图控制器。例如:
fname
和lname
的字段。email
字段。password
字段和一个"保存"按钮。现在,我创建了一个名为UIViewController
的新RegistrationViewController
类文件,并将该类分配给上面的所有视图控制器,以便我可以在一个文件中编写所有与注册相关的代码。
我使用push segue从当前视图控制器进入下一个视图控制器。
问题
当我点击"保存"我最后一个视图控制器上的按钮,我无法获取fname
,lname
和email
的值。
为什么会这样?我的意思是,我在同一个档案中。不应该为这些属性存储值吗?
答案 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;
}