如何设计良好的ViewController

2017-05-10  本文已影响1人  子疯zp

ViewController生命周期中有那么多函数,一个重要问题就是什么代码该写在什么地方。

  1. -(instancetype)initWithNibName:bundle:
    init里不要出现创建view的代码。良好的设计,在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据。init里不要掉self.view,否则会导致viewcontroller创建view。(因为view是lazyinit的)。

  2. -(void)loadView
    中只初始化view,一般用于创建比较关键的view如tableViewController的tabView,UINavigationController的navgationBar,不可掉用view的getter(在掉super loadView前),最好也不要初始化一些非关键的view。如果你是从nib文件中创建的viewController在这里一定要首先调用super的loadView方法,但建议不要重载这个方法。

  3. -(void)viewDidLoad
    这时候view已经有了,最适合创建一些附加的view和控件了。

  4. -(void)viewWillAppear:(BOOL)animated
    这个一般在view被添加到superview之前,切换动画之前调用。在这里可以进行一些显示前的处理。比如键盘弹出,一些特殊的过程动画(比如状态条和navigationbar颜色)。

  5. -(void)viewWillLayoutSubviews
    view 即将布局其 Subviews。比如 view 的 bounds 改变了(例如状态栏从不显示到显示,视图方向变化),要调整 Subviews 的位置,在调整之前要做的一些工作就可以在该方法中实现。

  6. -(void)viewDidLayoutSubviews
    view 已经布局其 Subviews。比如 view 的 bounds 改变了(例如状态栏从不显示到显示,视图方向变化),已经调整 Subviews 的位置,在调整完成之后要做的一些工作就可以在该方法中实现。

  1. -(void)viewDidAppear:(BOOL)animated
    视图已完全过渡到屏幕上时调用。在这个方法中执行视图显示相关附件任务,如果重载了这个方法,必须在方法中调用 [supper
    viewDidAppear]。
  1. -(void)viewWillDisappear:(BOOL)animated
    view 即将从 superView 中移除且移除动画切换之前,此时还没有调用 removeFromSuperview。

  2. -(void)viewDidDisappear:(BOOL)animated
    view从superView中移除,移除动画切换之后调用,此时已调用removeFromSuperview。

viewDidUnload :这时候viewController的view已经是nil了。由于这一般发生在内存警告时,所以在这里你应该将那些不在显示的view释放了。比如你在viewcontroller的view上加了一个label,而且这个label是viewcontroller的属性,那么你要把这个属性设置成nil,以免占用不必要的内存,而这个label在viewDidLoad时会重新创建。

  1. -(void)didReceiveMemoryWarning
    当系统的内存不足时,该方法会被调用,我们可以在该方法里释放掉部分暂时不用的资源。当系统发出内存警告时,会调用didReceiveMemoeryWarning方法,如果当前有能被释放的view,系统会调用viewWillUnload方法来释放view,完成后调用viewDidUnload方法,至此,view就被卸载了。此时原本指向view的变量要被置为nil,具体操作是在viewDidUnload方法中调用self.myButton = nil;

  2. -(void)dealloc
    viewController 最后的清理工作,释放视图对象的引用和 viewController 所需数据结构

小结一下:loadView和viewDidLoad的区别就是,loadView时view还没有生成,viewDidLoad时,view已经生成了,loadView只会被调用一次,而viewDidLoad可能会被调用多次(View可能会被多次加载),当view被添加到其他view中之前,会调用viewWillAppear,之后会调用viewDidAppear。当view从其他view中移除之前,调用viewWillDisAppear,移除之后会调用viewDidDisappear。当view不再使用时,受到内存警告时,ViewController会将view释放并将其指向为nil。

ViewController的生命周期中各方法执行流程如下:
init—>loadView—>viewDidLoad—>viewWillApper—>viewDidApper—>viewWillDisapper—>viewDidDisapper—>viewWillUnload->viewDidUnload—>dealloc

上一篇下一篇

猜你喜欢

热点阅读