我看过几篇关于ViewWillAppear
和ViewDidAppear
在某些情况下没有解雇的文章,但我仍然想知道这种行为背后的想法是什么,以及我如何在具体的情况下解决这个问题情况下。
window
有一个由聋人UIVieController
处理的视图,其中包含一个按钮。当从A切换到B时,我当然可以调用VC_MAIN,但我不想这样做。我想为切换设置动画,而不仅仅是打开另一个模态视图。
为什么这些方法不会被调用?它真的超越了我!如果你看一下UISplitViewController:它有两个子控制器,可以显示其他控制器。他们基本上和我想做的一样。 Apple是否在整个代码中放置了kludges?
答案 0 :(得分:1)
我对这类问题的经验:
如果您有一个视图控制器 VC 管理主视图 V ,并且此视图的子视图 V'由另一个视图控制器 VC管理',viewWillAppear:
和willRotateToInterfaceOrientation:
等其他方法不会发送到 VC'。
您可以从 VC :
手动转发这些来电- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[mySubViewController viewWillAppear:animated]; // VC'
}
(注意:我不熟悉MonoTouch所以我用ObjC代码回答)
修改强>
它提醒我View Controller Programming Guide明确指出:
每个自定义视图控制器对象 create负责管理所有人 在单个视图中的视图 层次结构。 [...]一对一 视图之间的对应关系 控制器和视图中的视图 层次结构是关键设计 考虑。你不应该使用 多个自定义视图控制器 管理相同的不同部分 查看层次结构。
答案 1 :(得分:0)
我猜测的原因是
之间的步骤根据设置,模态显示的视图控制器(VC_MAIN)将显示视图A或视图B.
视图A和B由不同的视图控制器(VC_A和VC_B)处理。
如果您阅读Apple的视图控制器编程指南中的介绍,他们建议每个屏幕只有一个视图控制器,即使它管理多个视图或子视图的层次结构。最好直接在VC_MAIN中管理视图A和B,然后您将获得所需的通知。如果您出于任何原因预先设置了单独的视图控制器,您可能需要自己通知它们。
答案 2 :(得分:-1)
您应该手动调用这些方法。它是一种管理和显示VC视图的自定义方式,因此您可以自行确定每个子视图控制器何时接收生命周期调用。 在VC_MAIN中,创建一个将调用
的showVC:newVc方法[newVc viewWillAppear]
[mainView addSubview:newVc.view]
[newVc viewDidAppear]
同样,创建一个hideVC:将调用viewWill / DidHide
在VC_Main viewWillAppear上,根据当前配置调用showVC方法,每次切换视图时,都会正确调用这些方法。
这是一个老问题,在iOS5上部分处理,但仍以这种方式运行良好,并且完全向后兼容iOS3。