子视图控制器的viewWillAppear方法未被调用

8

我有一个奇怪的情况--一个视图控制器在loadView中创建自己的视图,然后将其添加到现有视图中。

以下是创建并添加VC的代码:

self.doneButtonViewController = [[DoneButtonViewController alloc] init];
[self.view addSubview:self.doneButtonViewController.view];

这段代码在“父”VC的viewDidLoad方法中执行。

奇怪的是,添加的VC的viewWillAppear方法从未被调用(viewDidAppear也是如此),但是添加的VC的viewWillDisappear方法在适当的时间被调用,就像人们所期望的那样。

有什么线索可以解释为什么viewWillAppear没有被调用吗?


(顺便说一句,这个练习纯粹是为了获得子视图的viewWillAppear/viewWillDisappear行为,以实现一个相对“清晰”的数字键盘完成按钮。) - Hot Licks
2个回答

15

如果这样做,应用程序既不知道子视图的视图控制器,您需要引入视图控制器容器来使根视图控制器意识到。这样做将处理任何类似于这样的事件。

由于在iOS 6之前可能会多次调用loadView,因此我建议在init中创建视图控制器,然后在loadView中添加子视图。应该像这样:

- (id)init {
    ...
    self.doneButtonViewController = [[DoneButtonViewController alloc] init];
    [self addChildViewController:self.doneButtonViewController];
    [self.doneButtonViewController didMoveToParentViewController:self];
    ...
}

- (void)loadView {
    ...
    [self.view addSubview:self.doneButtonViewController.view];
    ...
}

请查看实现容器视图控制器


显然,loadView实现还需要构建父视图控制器的其余视图,但这是正确的答案。如果您正在使用storyboards或xibs创建父VC,则代码可以在viewDidLoad中。 - jrturton
问题是,我正在尝试想出一个最小的方案来添加这个 -- 基本上调用一个工厂方法来创建VC并添加视图。 - Hot Licks
你需要传递一个对应的视图控制器引用,并且使用相同的流程将其添加进去。如果你担心它可能会发生多次,那么可以在工厂内部编写检查代码以避免添加重复内容,或者准备好 removeFromParentViewController: 以便在需要时进行删除。 - WDUK
我曾尝试使用addChildViewController,但我没有意识到我还需要addSubview。有了这对,它的工作效果更或多或少符合预期。 - Hot Licks
1
所有addChildViewController所做的就是在两个视图控制器之间创建一个链接,它对视图本身没有任何影响。这个链接允许事件(例如viewWillAppear:)向下传播到子视图控制器,以便它们可以管理自己的视图。实际添加视图本身也需要以传统方式添加。 - WDUK

1
对于我而言,在父视图控制器中添加子视图控制器可以解决子视图控制器的 "viewWillAppear" 方法未被调用的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接