切换视图时的iOS特定行为

时间:2012-06-16 18:44:50

标签: iphone objective-c cocoa-touch viewwillappear

我看到一个与被调用的子视图方法相关的奇怪问题似乎是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下调用它们。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

你不应该在另一个视图控制器中有一个视图控制器的内容除了在iOS 5中添加的新的父/子视图控制器支持。它现在正式支持使用许多新方法(例如addChildViewController,transitionFromViewController) :toViewController:持续时间:选择:动画:完成)

如果您尝试在iOS 4或更早版本下尝试在另一个视图控制器的视图中托管视图控制器的视图,那么您每走一步都会对操作系统进行操作。