ViewWillAppear未在模态控制器中调用。这有什么不对?

时间:2011-03-11 14:17:01

标签: objective-c cocoa-touch ios4 xamarin.ios

我看过几篇关于ViewWillAppearViewDidAppear在某些情况下没有解雇的文章,但我仍然想知道这种行为背后的想法是什么,以及我如何在具体的情况下解决这个问题情况下。

  • window有一个由聋人UIVieController处理的视图,其中包含一个按钮。
  • 单击该按钮可以模态显示另一个视图控制器( VC_MAIN )。
  • 根据设置,模态显示的视图控制器( VC_MAIN )将显示视图A或视图B.
  • 视图A和B由不同的视图控制器处理( VC_A VC_B )。
  • VC_A VC_B 中均未调用ViewWill *或ViewDid *方法。
  • 我可以通过在相应的ViewDid *和ViewWill *方法中的 VC_MAIN 中手动调用它来解决它。但如果 VC_MAIN 决定从 VC_A 切换到 VC_B ,则无效。 VC_MAIN View *方法不会再次调用, VC_A VC_B 也不会。

当从A切换到B时,我当然可以调用VC_MAIN,但我不想这样做。我想为切换设置动画,而不仅仅是打开另一个模态视图。

为什么这些方法不会被调用?它真的超越了我!如果你看一下UISplitViewController:它有两个子控制器,可以显示其他控制器。他们基本上和我想做的一样。 Apple是否在整个代码中放置了kludges?

3 个答案:

答案 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。