我看到一个与调用子视图方法相关的奇怪问题,这似乎是特定于 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 下,subview 方法在 insertSubview 期间每个只被调用一次。但是,它会导致 4.3 下的问题,因为它们根本没有被调用。
我已经阅读了几篇与确保调用子视图方法相关的帖子,但我还没有看到类似这样的行为是依赖于 iOS 的。
此外,我能想到的唯一方法是在运行时检查 iOS 版本并直接为 iOS 4.3 调用子视图方法,而不是在 5.0 和 5.1 下调用它们。
有任何想法吗?