iPhone viewWillAppear没有开火

chz*_*hzk 114 iphone cocoa-touch ios

我读过许多有关职位有问题的人viewWillAppear,当你不创建视图层次只是权利.我的问题是我无法弄清楚这意味着什么.

如果我创建一个RootViewController并调用addSubView该控制器,我希望添加的视图可以连接起来viewWillAppear事件.

有没有人有一个复杂的程序化视图层次结构的例子,成功地viewWillAppear在每个级别接收事件?

Apple的Docs声明:

警告:如果属于视图控制器的视图直接添加到视图层次结构中,则视图控制器将不会收到此消息.如果向视图层次结构插入或添加视图,并且它具有视图控制器,则应直接向关联的视图控制器发送此消息.未能发送视图控制器此消息将阻止显示任何关联的动画.

问题是他们没有描述如何做到这一点."直接"是什么意思?你如何"间接"添加一个视图?

我对Cocoa和iPhone相当新,所以如果除了基本的Hello World垃圾之外还有来自Apple的有用示例,那将会很不错.

mma*_*alc 54

如果您使用导航控制器并设置其委托,则不会调用视图{Will,Did} {Appear,Disappear}方法.

您需要使用导航控制器委托方法:

navigationController:willShowViewController:animated:
navigationController:didShowViewController:animated:
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚在iOS4和iOS5中对此进行了测试:事实并非如此:设置navigationController的委托,然后将视图推送到它将触发viewWillAppear:等. (7认同)
  • 我没有设置我的导航控制器的委托,但仍然没有调用该方法.无论如何,我设置它然后我使用你上面提到的方法.谢谢. (2认同)

laj*_*jos 29

我遇到了同样的问题.在将其viewWillAppear添加为子视图之前,只需向视图控制器发送消息即可.(有一个BOOL参数告诉视图控制器它是否被动画显示.)

[myViewController viewWillAppear:NO];
Run Code Online (Sandbox Code Playgroud)

查看Metronome示例中的RootViewController.m.

(我实际上发现Apple的示例项目很棒.比HelloWorld更多;)

  • 请小心!!! 在iOS 5上不再是真的!自动调用viewWillAppear和viewDidAppear.如果您手动调用它,它将被调用两次. (6认同)
  • 实际上,您应该在将viewWillAppear添加到子视图后调用它.否则,IBOutlets/IBActions将不会被连线. (3认同)
  • 是的,之后.从XIB创建子视图,未调用viewWillAppear.自己打电话,一切正常. (2认同)

Chr*_*ris 18

我终于找到了这个工作的解决方案!

UINavigationControllerDelegate

我认为它的要点是将你的导航控件的委托设置为它所在的viewcontroller,并实现UINavigationControllerDelegate它的两种方法.辉煌!我很兴奋,我终于找到了解决方案!


Bil*_*fas 10

感谢 iOS 13。

ViewWillDisappear, ViewDidDisappear,ViewWillAppear并且 ViewDidAppear不会在 iOS 13 上的呈现视图控制器上调用,该控制器使用不覆盖整个屏幕的新模式呈现。

学分将归Arek Holko。他真的拯救了我的一天。

在此处输入图片说明


小智 8

我刚才有同样的问题.在我的应用程序中,我有2个导航控制器,并推动相同的视图控制器在每个工作在一个案例而不是在另一个案件.我的意思是当在第一个中推送完全相同的视图控制器时UINavigationController,viewWillAppear被调用但不是在第二个导航控制器中推送时.

然后我遇到这个帖子UINavigationController应该调用viewWillAppear/viewWillDisappear方法

并意识到我的第二个导航控制器确实重新定义了viewWillAppear.筛选代码显示我没有打电话

[super viewWillAppear:animated];
Run Code Online (Sandbox Code Playgroud)

我加了它,它工作了!

文件说:

如果重写此方法,则必须在实现中的某个时刻调用super.


Jos*_*non 5

我一直在使用导航控制器.当我想要下降到另一个级别的数据或显示我的自定义视图时,我使用以下内容:

[self.navigationController pushViewController:<view> animated:<BOOL>];
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我确实得到了viewWillAppear解雇的功能.我认为这有资格作为"间接",因为我addSubView自己并没有调用实际的方法.我不知道这是否100%适用于您的应用程序,因为我无法判断您是否使用导航控制器,但它可能会提供线索.