【问题标题】:didMoveToParentViewController and willMoveToParentViewControllerdidMoveToParentViewController 和 willMoveToParentViewController
【发布时间】:2015-11-13 20:32:01
【问题描述】:

UIViewController 上的 Apple 文档说:

如果你实现自己的容器视图控制器,它必须在调用removeFromParentViewController方法之前调用子视图控制器的willMoveToParentViewController:方法,传入一个父值nil。

当您的自定义容器调用addChildViewController: 方法时,它会自动调用视图控制器的willMoveToParentViewController: 方法,以便在添加之前将其添加为子项。

如果你正在实现自己的容器视图控制器,它必须在转换到新控制器之后调用子视图控制器的didMoveToParentViewController:方法,或者如果没有转换,在调用addChildViewController:之后立即方法。

removeFromParentViewController 方法在移除子视图后会自动调用子视图控制器的didMoveToParentViewController: 方法。

我为什么要调用这些方法?这些方法有什么作用?

ProfileViewController *profile = [[ProfileViewController alloc] init];
profile.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self addChildViewController:profile];
[self.view addSubview:profile.view];
[profile didMoveToParentViewController:self];

即使我删除了最后一行,我的代码也能完美运行。有人可以帮我吗?

提前致谢

【问题讨论】:

  • 这些方法只用于某些情况。在您将视图控制器移动到视图控制器/从视图控制器中移除视图控制器之后/之前。如果只是添加/推送/删除/弹出,你不必调用它。
  • 删除这些方法不会显示任何变化。添加它们也是如此
  • 是的。这是正确的。这种方法没有任何作用。只是 didMoveToParentViewController 方法的调用。如果你不实现它,调用它 -> 不做任何事情。
  • 它会对内存管理做些什么吗?
  • 不是。你可以忽略它。

标签: ios objective-c iphone uiviewcontroller


【解决方案1】:

基本上,它们不会做任何您可以在界面中注意到的事情。 “然而,任何子类都允许它们被覆盖,所以如果你不调用它们,你不会破坏一个裸 UIViewController,但你会破坏依赖它的子类(例如:假设一个子类想要释放一个对象当它从父视图控制器中移除时,如果您不调用该方法,那么它将永远不会释放该对象)。”正如 cmets here 中所解释的那样。

【讨论】:

    【解决方案2】:

    使用这些方法是因为它是添加或删除子视图控制器时要遵循的规则。在添加子视图控制器之前,应首先调用willMoveToParentViewController 方法,然后调用didMoveToParentViewController 方法。从父视图控制器中删除子视图控制器时,这些方法将以相反的顺序调用。

    addChildViewController: 自动调用[child willMoveToParentViewController:self]。所以应该在addChildViewController: 之后调用didMoveToParentViewController。同样removeFromParentViewController: 自动调用[child didMoveToParentViewController:nil]。所以应该在removeFromParentViewController:之前调用willMoveToParentViewController:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      相关资源
      最近更新 更多