你能给我解释一下管理UIViewController生命周期的正确方式吗?
特别地,我想知道如何使用初始化,ViewDidLoad, ViewWillAppear, ViewDidAppear, ViewWillDisappear, ViewDidDisappear, ViewDidUnload和Dispose方法在UIViewController类的Mono Touch。
你能给我解释一下管理UIViewController生命周期的正确方式吗?
特别地,我想知道如何使用初始化,ViewDidLoad, ViewWillAppear, ViewDidAppear, ViewWillDisappear, ViewDidDisappear, ViewDidUnload和Dispose方法在UIViewController类的Mono Touch。
当前回答
让我们集中在方法上,它们负责UIViewController的生命周期:
Creation: - (void)init - (void)initWithNibName: View creation: - (BOOL)isViewLoaded - (void)loadView - (void)viewDidLoad - (UIView *)initWithFrame:(CGRect)frame - (UIView *)initWithCoder:(NSCoder *)coder Handling of view state changing: - (void)viewDidLoad - (void)viewWillAppear:(BOOL)animated - (void)viewDidAppear:(BOOL)animated - (void)viewWillDisappear:(BOOL)animated - (void)viewDidDisappear:(BOOL)animated - (void)viewDidUnload Memory warning handling: - (void)didReceiveMemoryWarning Deallocation - (void)viewDidUnload - (void)dealloc
更多信息请查看UIViewController类参考。
其他回答
在官方文档中解释状态转换:https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/index.html
这张图片显示了各种视图' will '和' did '回调方法之间的有效状态转换
有效的状态转换:
取自:https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Art/UIViewController类Reference_2x.png
iOS 10,11 (Swift 3.1,Swift 4.0)
根据UIKit开发者的UIViewController,
1. loadView ()
如果子类没有使用nib,就应该在这里创建自定义视图层次结构。不要直接打电话。
2. loadViewIfNeeded ()
如果视图控制器的视图尚未被设置,则加载视图控制器的视图。
3. 视图加载()
在视图加载后调用。对于在代码中创建的视图控制器,它位于-loadView之后。对于从nib未归档的视图控制器,这是在视图被设置之后。
4. viewWillAppear(_ animated: Bool)
当视图即将变为可见时调用。违约不起任何作用
5. viewWillLayoutSubviews ()
在视图控制器的视图的layoutSubviews方法被调用之前调用。子类可以根据需要实现。违约不起任何作用。
6. 视图布局子视图()
在视图控制器的视图的layoutSubviews方法被调用之后调用。子类可以根据需要实现。违约不起任何作用。
7. viewDidAppear(_ animated: Bool)
当视图完全转换到屏幕上时调用。违约不起任何作用
8. viewWillDisappear(_ animated: Bool)
当视图被解散、覆盖或以其他方式隐藏时调用。违约不起任何作用
9. viewDidDisappear(_ animated: Bool)
在视图被解散,覆盖或以其他方式隐藏后调用。违约不起任何作用
10. viewWillTransition(大小:CGSize,协调器:UIViewControllerTransitionCoordinator)
视图正在转换时调用。
11. willMove(到父视图控制器:UIViewController?)
12. didMove(to arentviewcontroller parent: UIViewController?)
这两个方法是公共的,供容器子类在子控制器之间转换时调用。如果它们被覆盖,覆盖应确保调用超级。
当子对象从父对象中移除时,这两个方法中的父对象参数都为nil;否则它等于新的父视图控制器。
13. didReceiveMemoryWarning ()
当父应用程序接收到内存警告时调用。在iOS 6.0上,默认情况下它将不再清除视图。
海德尔的答案适用于ios 6之前的版本。然而,在iOS 6中,viewDidUnload和viewWillUnload从未被调用。文档声明:“视图在低内存条件下不再被清除,因此该方法永远不会被调用。”
更新:ViewDidUnload在iOS 6中已弃用,因此更新了相应的答案。
UIViewController的生命周期如图所示:
使用Xamarin Native/Mono Touch的优势在于,它使用了原生api,因此它遵循与Apple文档中相同的ViewController生命周期。
图中没有提到viewWillLayoutSubviews和viewDidLayoutSubviews方法,但是在viewWillAppear和viewDidAppear之间调用这些方法。它们可以被多次调用。