呈现视图控制器是否会使所有对象无效?

时间:2013-08-13 07:08:55

标签: objective-c uiviewcontroller uilabel

我有两个视图控制器,FirstViewController和FourthViewController。 FirstViewController是我的初始视图控制器。我在FirstViewController中有一个UILabel,mainLab。我用

呈现FourthViewController
[self presentViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"FourthViewController"] animated:YES completion:nil];

然后,在推送FourthViewController之后,我使用委托尝试在FirstViewController中更改mainLab的文本。但是,这并没有改变mainLab的文本。我检查并且在推送视图控制器后mainLab变为null。话虽如此,即使mainLab被FourthViewController的推送无效,我也会在推送FourthViewController时更改标签的文本?

1 个答案:

答案 0 :(得分:0)

您应该展示一些代码。然而,这是我的猜测,我从我理解视图控制器的生命周期之前的相似经历中获取(这是BTW的详细记录)。

我假设您直接在委托方法中设置了UIControls(UILabel等)。如果这是真的:不要戴帽子。在没有视图控制器的情况下,不要直接访问任何IBOutlet或查看项目。

而是声明一个NSNumberNSString的属性,非常适合传输您要设置的数据。提供一个自定义setter来设置相关的UILabel等,但仅限于它,如果它不是nil。 (您也可以声明私有实例变量,并提供准setter方法。) 在viewDidLoad方法中,也可以根据属性的值设置UILables等。

在您的案例中发生的事情是您设置,在presentViewController之前或之后,可以说是UILable的文本。在您的单行代码中,您甚至可以实例化视图控制器然后呈现它。从字面上看。视图控制器是实例化的。意味着创建了一个新的并且所有值都获得了它们的默认值(在某些情况下可能为零或空字符串或故事板中设置的任何值)。

但即使您在此之后直接从调用视图控制器访问UILabel(等),也无法保证新实例化的视图控制器在此期间已完全加载。如果稍后加载新视图控制器,则会再次覆盖您的设置。除非你听从我的建议。

还有其他“黑客”旨在强制在实际设置其视图项值之前加载新视图控制器。我试了一两个,他们工作得很好。但是不能保证它们将来也会起作用,这就是为什么我建议正确地做到这一点。