didMoveToParentViewController 和 willMoveToParentViewController
didMoveToParentViewController and willMoveToParentViewController
关于 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];
即使我删除了最后一行,我的代码也能完美运行。有人可以帮我吗?
提前致谢
使用这些方法是因为它是添加或删除子视图控制器时要遵循的规则。在添加子视图控制器之前,应首先调用 willMoveToParentViewController
方法,然后调用 didMoveToParentViewController
方法。从父视图控制器中删除子视图控制器时,将以相反的顺序调用这些方法。
addChildViewController:
自动调用 [child willMoveToParentViewController:self]
。所以应该在 addChildViewController:
之后调用 didMoveToParentViewController
。同样 removeFromParentViewController:
自动调用 [child didMoveToParentViewController:nil]
。所以应该在 removeFromParentViewController:
之前调用 willMoveToParentViewController:
基本上,它们不会执行您可以在界面中注意到的任何操作。 "However, any subclass allows them to be overridden, so if you don't call them, you won't break a bare UIViewController, but you will break subclasses that rely on it (for instance: say a subclass wants to release an object when it is removed from a parent view controller, if you don't call the method, then it will never release the object)." 正如评论中所解释的那样 here。
关于 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];
即使我删除了最后一行,我的代码也能完美运行。有人可以帮我吗?
提前致谢
使用这些方法是因为它是添加或删除子视图控制器时要遵循的规则。在添加子视图控制器之前,应首先调用 willMoveToParentViewController
方法,然后调用 didMoveToParentViewController
方法。从父视图控制器中删除子视图控制器时,将以相反的顺序调用这些方法。
addChildViewController:
自动调用 [child willMoveToParentViewController:self]
。所以应该在 addChildViewController:
之后调用 didMoveToParentViewController
。同样 removeFromParentViewController:
自动调用 [child didMoveToParentViewController:nil]
。所以应该在 removeFromParentViewController:
willMoveToParentViewController:
基本上,它们不会执行您可以在界面中注意到的任何操作。 "However, any subclass allows them to be overridden, so if you don't call them, you won't break a bare UIViewController, but you will break subclasses that rely on it (for instance: say a subclass wants to release an object when it is removed from a parent view controller, if you don't call the method, then it will never release the object)." 正如评论中所解释的那样 here。