【发布时间】:2012-06-16 18:44:49
【问题描述】:
我看到一个与调用子视图方法相关的奇怪问题,这似乎是特定于 iOS 版本的。
我有两个带有父视图控制器的可交换视图,而不是决定显示哪一个。基本上,登录视图会在您登录时换出到帐户视图,并在您注销时换回登录。
代码非常简单。这是您登录时调用的父视图控制器的示例方法:
- (void) showAccountView:(BOOL)animated
{
if(self.accountController == nil)
self.accountController = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease];
[self.loginController viewWillDisappear:animated];
[self.accountController viewWillAppear:animated];
[self.loginController.view removeFromSuperview];
[self.view insertSubview:alertsController.view atIndex:0];
[self.loginController viewDidDisappear:animated];
[self.accountController viewDidAppear:animated];
}
还有一个类似这样的用于显示登录视图。很简单。我遇到的问题是 viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear 方法都在 iOS 4.3 下被调用一次,但在 iOS 5.0 和 5.1 下被调用两次。
例如,在所有 iOS 版本中,子视图的 viewWillAppear 会在父视图直接调用时被调用(当然)。但是,只有 iOS 5.0 和 5.1 会在调用 insertSubview 期间再次调用它。
所以,如果我删除除了对 removeFromSuperview 和 insertSubview 的调用之外的所有内容,那么它看起来像这样:
- (void) showAccountView:(BOOL)animated
{
if(self.accountController == nil)
self.accountController = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease];
[self.loginController.view removeFromSuperview];
[self.view insertSubview:alertsController.view atIndex:0];
}
现在在 5.0 和 5.1 下,子视图方法在 insertSubview 期间仅被调用一次。但是,它在 4.3 下会导致问题,因为它们根本不会被调用。
我已经阅读了几篇与确保调用子视图方法相关的帖子,但我还没有看到类似这样的行为是依赖于 iOS 的。
我能想到的唯一方法是在运行时检查 iOS 版本并直接为 iOS 4.3 调用子视图方法,而不是在 5.0 和 5.1 下调用它们。
有什么想法吗?
【问题讨论】:
-
首先,你不应该打电话给
viewWill/Did...其次,你怎么知道他们没有被打电话? -
我同意你的观点,我不应该给他们打电话,但显然我这样做了,因为他们在 4.3 中没有被自己调用。我可以告诉他们没有被调用,因为我设置的断点没有被击中。此外,从视图的功能可以明显看出它们没有被调用。实际上,我刚刚发现 this post 讨论了与我在答案中看到的问题类似的问题。他们似乎认为这是 iOS 中的一个错误,并建议使用动态版本检查。
标签: iphone objective-c cocoa-touch viewwillappear