视图控制器包含在ios5中是如何工作的



在WWDC 2011年第102次会议上,Apple介绍了视图控制器容器,这是创建自定义视图控制器容器的能力,类似于UITabBarController, UINavigationController等。

这些例子我看了好几遍。与此模式相关的方法有很多,但要准确地找出它们有点困难。我将在这里发布我认为正在发生的事情,看看社区是否会证实或反驳我的怀疑。

场景1:从无父视图控制器移动到新的父视图控制器

[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

前两行必须按照给定的顺序出现吗,还是可以反过来?

场景2:从父视图控制器移动到无父视图控制器

[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];

还需要呼叫[vc didMoveToParentViewController:nil]吗?会话102 中的示例在此场景中没有执行此,但我不知道这是否是遗漏。

场景3:从一个父视图控制器移动到另一个

这可能会以以下方式发生,因为每个父视图控制器中的逻辑将被封装。

// In the old parent
[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// In the new parent
[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view];
[vc didMoveToParentViewController:self];

我的主要问题是:这是视图控制器包含应该如何工作,在一般情况下?上面给出的机制正确吗?

是否需要先调用willMoveToParentViewController再调用addChildViewController ?在我看来,这似乎是合乎逻辑的顺序,但这是严格必要的吗?

呼叫removeFromParentViewController后有必要再呼叫didMoveToParentViewController:nil吗?

UIViewController文档非常清楚何时和何时不调用willMove/didMove方法。查看"实现容器视图控制器"文档。

文档说,如果你不覆盖addChildViewController,你不必调用willMoveToParentViewController:方法。但是,在转换完成后,您确实需要调用didMoveToParentViewController:方法。同样,在调用removeFromParentViewController方法之前,容器视图控制器有责任调用willMoveToParentViewController:方法。removeFromParentViewController方法调用子视图控制器的didMoveToParentViewController:方法。"

另外,这里有一个示例,这里有示例代码。

好运

这部分不正确:

[vc willMoveToParentViewController:self];
[self addChildViewController:vc];
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

根据文档:

当你的自定义容器调用addChildViewController:方法时,它会在添加视图控制器之前自动调用作为子视图控制器的willMoveToParentViewController:方法。

所以你不需要[vc willMoveToParentViewController:self]调用。在调用[self addChildViewController:vc]时自动完成。下面是代码示例:

[self addChildViewController:vc];
// [vc willMoveToParentViewController:self] called automatically
[self.view addSubview:vc.view]; // or something like this.
[vc didMoveToParentViewController:self];

用于移除视图控制器:

removeFromParentViewController方法在移除子视图控制器后会自动调用子视图控制器的didMoveToParentViewController:方法。

这个调用可能是[oldVC didMoveToParentViewController:nil]

[vc willMoveToParentViewController:nil];
[vc.view removeFromSuperview];
[vc removeFromParentViewController];
// [vc didMoveToParentViewController:nil] called automatically

最新更新