2016-08-14 123 views
1

我已经开始学习iOS开发(使用Objective-C),并遇到以下问题。在相同视图控制器类之间传递数据

我做了什么至今:

我要注册过程分为若干视图控制器。例如:

  • 视图控制器1的字段为fnamelname
  • 视图控制器2有一个用于email的字段。
  • 视图控制器3有一个字段password和一个“保存”按钮。现在

,创建了一个新UIViewController类文件名为RegistrationViewController和分配该类上述所有视图控制器,这样我可以在一个文件中写入所有登记相关的代码。

我已经使用push segue从当前视图控制器到下一个视图控制器。

发行

当我点击最后一个视图控制器上的“保存”按钮,我没能得到的值fnamelnameemail

这是为什么?我的意思是,我在同一个文件中。不应该为这些属性存储价值吗?

回答

1

我用push segue来到viewcontoller的下一个viewcontroller。

推赛格瑞推视图控制器的一个全新的实例,这意味着在顶部当前视图控制器将只有在自身设定的值,而值在其所有前任的设置将nil

你不应该依赖于在视图控制器的字段中存储值。相反,你应该把它们放在你的模型类的共享实例,通过模型 - 视图 - 控制器设计模式的建议:

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

当检测到下一个视图控制器即将开启,存储状态

Model.sharedInstance.fName = self.fName 
Model.sharedInstance.fName = self.lName 
... 
+0

感谢您的建议。您正确使用共享实例是一个正确的选择。你能给我一个简单的想法,告诉我如何创建一个共享实例,以便它可以适用于所有这三个viewcontollers。我创建了一个新的“AllUsers.h”(NSObject)类文件。 – Jimmy

+0

我使用的是Objective-C语言。 – Jimmy

+0

@Jimmy对不起,我错过了Objective-C部分。 [这是一个在Objective-C中使用单例模型的例子Q&A](http://stackoverflow.com/a/11945106/335858)。这是相当复杂的,但它本质上是一个复制粘贴练习。 – dasblinkenlight

1

仅仅因为数据是在“同一个文件”并不意味着任何东西在运行时应用:当前一个共享模型对象积累。您仍然在创建RegistrationViewController类的多个单独实例。因此,您需要在这些单独的实例之间传递数据,就像完全不同的类一样。

由于您使用的是故事板和segues,因此方法-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; 
} 
+0

感谢您的建议。我已经使用shouldPerformSegueWithIdentifier,因为我想在继续下一个视图控制器之前执行验证。 – Jimmy

+0

理想情况下,您应该使用_both_。 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''*'''' – Arclite

+0

是否应该在-prepareForSegue方法之前调用SegmentWithIdentifier? – Jimmy

相关问题