4

我想知道是否有任何方法-viewWillAppear:会在没有匹配的情况下被调用-viewDidAppear:-viewWillDisappear和同上-viewDidDisappear

我的问题的根源是在哪里注册和取消注册 KVO 和/或对象的 NSNotifications 的更改通知将导致视图控制器更新视图。

例如,我有一个正在异步处理的模型对象,它的字符串属性可能会改变。我希望视图控制器对这些属性进行 KVO,并通过换出由所述视图控制器管理的标签的文本来反映任何更改。

您在哪里注册和取消注册通知,为什么?

编辑:

我遇到的一个问题是在应用程序状态更改(例如,等)的情况下该怎么-applicationWillResignActive-...didEnterBackground。这些更改似乎不会触发视图控制器生命周期方法。这里有什么最佳实践吗?

4

2 回答 2

6

使用标准容器视图控制器,您将始终成对地收到 will/did 消息。如果您编写了自己的视图控制器容器,则可能不会,但这将是容器实现中的错误。

大多数时候,您会希望在“遗嘱”消息中进行设置和拆除。这使您的视图控制器可以在它变得“活跃”之前尽早完成它需要做的任何事情,并且在您不再需要它们时尽早关闭它们。

在导航堆栈中推送视图控制器时,完全有可能在推送动画期间发生通知。如果您在 viewDidAppear 中设置观察者,您将错过该通知。你想尽快听到。

同样,我认为 viewDidDisappear 为时已晚,无法删除回调。例如,可以在 viewDidDisappear 中停止位置管理器,但可以在消失动画期间传递另一个位置更新。这可能不会造成太大伤害,但是根据应用程序的不同,可能会发生一些奇怪的事情,例如在您已经离开视图控制器后出现的警报视图 - 这对用户来说看起来像是闪烁。

如上所述,任何与视图无关的内容都出现在“will”方法中。那么,will 与 did 的选择实际上是关于用户所看到的。动画应该从 viewDidAppear 开始,否则,用户将看不到在 will/did Appear 期间发生的帧。数据应该移动到 viewWillAppear 中的视图,否则,一个空白的视图会过渡进来,数据只会在过渡动画完成后出现。此外,可以在 viewWillAppear/viewDidAppear 之间调整视图框架,就像堆栈中的前一个视图控制器隐藏/显示导航栏的情况一样。

顺便说一句,我不会在这里详细介绍,但我会反对 KVO 用于将数据从模型移动到视图对象的控制器交互。难以测试且难以追踪。

于 2013-06-29T19:17:50.533 回答
0

您可以将您的子类UILabel和在您的子类中覆盖 setText 方法:

-(void)setText:(NSString *)newText {

    //do your KVO updates here

    [super setText:newText];
}

希望这可以帮助

于 2013-03-13T18:44:14.853 回答