iOS开发点滴selectorapi-UI

iOS UIViewController和UIView的生命周期

2019-08-07  本文已影响0人  Coder_Cat

UIViewController的生命周期

// 类的初始化方法
+ (void)initialize;
//通过xib来初始化控制器
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil ;
// 对象初始化方法
- (instancetype)init;
// 从归档初始化
- (instancetype)initWithCoder:(NSCoder *)coder;
//归档初始化后唤醒nib
-(void)awakeFromNib;
// 加载视图:当访问UIViewController的view属性时,view如果此时是nil,那么VC会自动调用loadView方法来初始化一个UIView并赋值给view属性。此方法用在初始化关键view,需要注意的是,在view初始化之前,不能先调用view的getter方法,否则将导致死循环(除非先调用了[super loadView];)如果没有重载loadView方法,则UIViewController会从nib或StoryBoard中查找默认的loadView,默认的loadView会返回一个空白的UIView对象。
-(void)loadView;
// 视图加载完成
- (void)viewDidLoad;
// 将要展示:,在view即将添加到视图层级中(显示给用户)且任意显示动画切换之前调用,此时self.view.superview为nil.这个方法中完成任何与试图显示相关的任务,例如改变视图方向、状态栏方向、视图显示样式等。
-(void)viewWillAppear:(BOOL)animated;
// 将要布局子视图,self.view.superview为_UIParallaxDimmingView
-(void)viewWillLayoutSubviews;
// 已经布局子视图
-(void)viewDidLayoutSubviews;
// 已经展示:在view被添加到视图层级中,显示动画切换之后调用(这时view已经添加到supperView中)。在这个方法中执行视图显示相关附件任务,如果重载了这个方法,必须在方法中调用[supper viewDidAppear];,此时self.view.superview为UIViewControllerWrapperView。
-(void)viewDidAppear:(BOOL)animated;
// 将要消失:view即将从supperView中移除,移除动画切换之后调用,此时已调用removeFromSuperview。此时self.view.superview还是superview为UIViewControllerWrapperView.
-(void)viewWillDisappear:(BOOL)animated;
// 已经消失:view从superView中移除,移除动画切换之后调用,此时已调用removeFromSuperview。此时self.view.superview还是superview为nil.
-(void)viewDidDisappear:(BOOL)animated;
// 内存警告
- (void)didReceiveMemoryWarning;
// 销毁释放
-(void)dealloc;



xib pop时调用顺序.png
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        NSLog(@"%@: %s",NSStringFromClass([self class]) ,__func__);
        self.view = [UIView new];
        self.view.frame = CGRectMake(0, 88, 100, 200);
        self.view.backgroundColor = UIColor.greenColor;
    }
    return self;
}
initWithCoder方法中创建的self.view.png
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        NSLog(@"%@: %s",NSStringFromClass([self class]) ,__func__);
         self.view.backgroundColor = UIColor.greenColor;
    }
    return self;
}
initWithNibName方法中重写self.view的getter方法.png

UIView的生命周期

//构造方法,初始化时调用,不会调用init方法
- (instancetype)initWithFrame:(CGRect)frame;
//添加子控件时调用
- (void)didAddSubview:(UIView *)subview ;
//构造方法,内部会调用initWithFrame方法
- (instancetype)init;
//xib归档初始化视图后调用,如果xib中添加了子控件会在didAddSubview方法调用后调用
- (instancetype)initWithCoder:(NSCoder *)aDecoder;
//唤醒xib,可以布局子控件
- (void)awakeFromNib;
//父视图将要更改为指定的父视图,当前视图被添加到父视图时调用
- (void)willMoveToSuperview:(UIView *)newSuperview;
//父视图已更改
- (void)didMoveToSuperview;
//其窗口对象将要更改
- (void)willMoveToWindow:(UIWindow *)newWindow;
//窗口对象已经更改
- (void)didMoveToWindow;
//布局子控件
- (void)layoutSubviews;
//绘制视图
- (void)drawRect:(CGRect)rect;
//从父控件中移除
- (void)removeFromSuperview;
//销毁
- (void)dealloc;
//将要移除子控件
- (void)willRemoveSubview:(UIView *)subview;


xib创建初始化视图,xib中添加子控件时调用顺序.png

UIViewController和UIView进入展示时整体生命周期调用顺序

UIViewController和UIView加载展示时整体生命周期调用顺序.png
  1. vc(控制器)的viewDidLoad方法;
  2. NoXibViewwillMoveToSuperviewdidMoveToSuperview,此时已将NoXibView添加到父视图上;
  3. vc的viewWillDisappear方法,促使vc的view的superview和window还是为nil;
  4. NoXibViewwillMoveToWindowdidMoveToWindow,此时已将NoXibView添加到widonw;
  5. vc的viewWillLayoutSubviews ,此时vcviewsuperviewwindow不再为nil;
  6. vc的viewDidLayoutSubviews ;
  7. NoXibViewlayoutSubviews;
  8. vc的viewDidAppear .
UIViewController和UIView消失销毁时整体生命周期调用顺序.png
  1. vc的viewWillDisappear;
  2. NoXibViewwillMoveToWindow,didMoveToWindow,此时NoXibView的window置nil;
  3. vc的viewDidDisappear;此时vc的view的window和superview都置为nil;
  4. vc的'dealloc';
  5. NoXibViewwillMoveToSuperviewdidMoveToSuperview,此时NoXibViewsuperview置nil;
  6. NoXibViewremoveFromSuperview;
  7. NoXibView的'dealloc';
  8. NoXibView的'willRemoveSubview'.

开发技巧总结


适用于iOS的View Controller编程指南
UIView - 生命周期

上一篇 下一篇

猜你喜欢

热点阅读