UIViewController简介

主要工作:

  1. 更新view,修改view数据
  2. 响应用户交互
    • UIViewController也是UIResponder对象,在responder chain中的位置处于UIViewController的根视图和其父视图之间
    • 如果view controller内的视图都不处理事件,那么view controller将会处理事件、或者将事件传递给视图的父视图
  3. 管理view布局,调整view大小

为view controller指定view

  1. 通过storyboard加载view,同时能指定view controller和view之间的关联,还能指定viewcontrollers之间的关联
    • 使用instantiateViewControllerWithIdentifier:获取UIStoryBoard对象
  2. 通过nib file创建views
    • 使用initWithNibName:bundle:来进行viewcontroller初始化
  3. 使用loadview
    • 在loadview方法中手动代码创建view和视图之间的关系

view controller的根视图(root view)总是会适应指定的空间,而其他view则需要使用 Auto Layout 来自适应布局

管理view

  • @property(nonatomic, strong) UIView *view
    • view controller的root view,默认为空
    • 当访问这个属性且这个属性为空时,view controller会自动调用loadview方法,并返回loadview返回的view
    • 每个view controller都是root view唯一的拥有者
    • 当低内存时view controller会将view赋为nil
  • -(void)loadView
    • 当属性view为nil时,加载或者创建view并assign给属性view
    • 当view controller有一个相关联的nib file文件,这个方法将会从nib file中加载view
    • 如果是通过 Interface Builder 方式创建的view,请不要override这个方法
    • 如果是希望通过手动代码创建view,可以重载这个方法
    • 有更多view相关的初始化操作 ,可以在viewdidload中进行
    • 不要在这个方法里调用 [supper loadView] 或者 self.view
  • -(void)viewDidLoad
    • 当controller'€™s view 后会被调用
    • 通过nib file加载view 还是通过loadview中手动创建view 都会调用viewdidload

展示view controller

  • -(void)showViewController:(UIViewController *)vc sender:(id)sender
    • 目的就是简化编程,省去判断一些条件。比如,会自动为nav controller有关的vc调用push,而为普通的view controller调用present函数。
  • -(void)showDetailViewController:(UIViewController *)vc sender:(id)sender
    • 为了UISplitViewController 而写的高级版showViewController
  • -(void)presentViewController:(UIViewController*)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
    • 传统的模态跳转方法
  • -(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion
    • 与presentViewController搭配使用

配置view布局行为

  • -(void)viewWillLayoutSubviews
    • 通知view controller它的view将要布局subviews
  • -(void)viewDidLayoutSubviews
    • 通知view controller的view subviews已经完成布局
      • addSubview会触发layoutSubviews
      • 设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
      • 滚动一个UIScrollView会触发layoutSubviews
      • 旋转Screen会触发父UIView上的layoutSubviews事件
      • 改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
  • -(void)updateViewConstraints
    • 当view controller的view需要更新约束的时候
posted @ 2016-04-08 15:23  孙焱焱  阅读(633)  评论(0编辑  收藏  举报