是否应该明确调用 willMoveToParentViewController:(UIViewController *)parent & didMoveToParentViewControll

Posted

技术标签:

【中文标题】是否应该明确调用 willMoveToParentViewController:(UIViewController *)parent & didMoveToParentViewController:(UIViewController *)parent?【英文标题】:Should EXPLICITLY call willMoveToParentViewController:(UIViewController *)parent & didMoveToParentViewController:(UIViewController *)parent? 【发布时间】:2012-11-29 02:20:49 【问题描述】:

WWDC 2012 会议 中,标题为 iOS 上的视图控制器的演变- (void)willMoveToParentViewController:(UIViewController *)parent- (void)didMoveToParentViewController:(UIViewController *)parent 被提及用于视图转换的自定义容器实现.

如果我没记错的话,似乎需要在- (void)removeFromSuperview 之前或- (void)addSubview:(UIView *)view 之后显式调用这些方法

但是,当我在子类实现中记录它们时,它显示它们已被称为 IMPLICITLY。它们已自动在正确的位置被调用。

所以,如果真的需要显式调用这些方法(如 WWDC 会话中的指示),或者不遵循它并清除不必要的代码行,我有点困惑。

【问题讨论】:

How does View Controller Containment work in ios 5? 的排序重复 【参考方案1】:

在我的书中解释过:

http://www.apeth.com/iOSBook/ch19.html#_container_view_controllers

基本上其中一个确实是隐式调用的,但另一个你必须显式调用。真让人抓狂;我每次都要查规则。

【讨论】:

removeFromSuperviewremoveFromParentViewController 被称为一对时,我看到didMoveToParentViewController 的冗余日志引起了我的困惑,而视图正在动画。感谢您的澄清,我确实能够确认正确使用 海报提到的这本书是免费的、在线的、有用的。我编辑了答案以明确这一点,但我的编辑被拒绝了。 嘿@matt!我有一个给你:唯一的事情是,viewWillAppear(等等)被调用两次。看起来真的很乱。例如,我只是将一个固定的 VC 放在屏幕上的一个盒子里。所以 addChildVC,然后是 addSubview,然后是 didMoveToParent。为此,您将获得 viewWillAppear。但是,如果您使用故事板容器视图,苹果似乎会偷偷地避免这个问题。 (我必须从众多 VC 中选择一个,所以,我手动进行。)糟透了!感谢这篇文章 @JoeBlow 如果你得到viewWillAppear 两次,你做错了什么。我有一些示例说明如何做到这一点,记录所有内容以证明正确的消息在正确的时间到达:例如,github.com/mattneub/Programming-iOS-Book-Examples/blob/master/… 以及 github.com/mattneub/Programming-iOS-Book-Examples/blob/master/… 记录... 嗯 - 我非常感谢@Matt 的评论,谢谢。我在这里减少了这个问题...***.com/questions/25593285...请注意,有趣的是,我正在制作一个全新的 vc(不是人们通常测试的案例,因为它微不足道且容易忘记,现在每个人都使用容器视图)...所以.. 我不知道。再次感谢!

以上是关于是否应该明确调用 willMoveToParentViewController:(UIViewController *)parent & didMoveToParentViewControll的主要内容,如果未能解决你的问题,请参考以下文章

是否在空的初始化程序列表(并明确指定类型)上调用 std::min 未定义的行为?

在路由器订阅中调用订阅方法时,我是不是应该取消订阅 ActivatedRoute?

在非构造的“对象”上调用非虚拟成员函数是不是定义明确? [复制]

库是不是应该明确针对 .NET Core 3?

不调用对象的析构器是未定义的行为吗?

调用 Clear 是不是也会处理这些项目?