1

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

有任何想法吗?

4

1 回答 1

0

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

如果您确实尝试在 iOS 4 或更早版本下将一个视图控制器的视图托管在另一个视图控制器中,那么您每一步都在与操作系统作斗争。

于 2012-06-17T01:30:42.573 回答