iOS UIViewController 应用要点

原创
2013/02/22 16:44
阅读数 1K
 

iOS UIViewController 应用要点

iOS UIViewController 使用要点

        1. 视图控制对象有一个类型为UIView的属性view。这个视图通常会有子视图,例如按钮和标签。视图控制对象通常是UIViewController的子类。拥有一个名为view的实例变量。

        2. 视图控制对象的作用是充当其视图的控制器对象。此外,通常还需要一个对像来负责视图的交换工作。

        3. 有两种创建视图的方法,一种是用代码创建视图,一种是创建xib文件。如何决定使用那种方法,这里有一条经验法则:

           当视图控制器对象只有一个视图的时候(没有子视图),那么用代码来创建单个视图通常会更容易。如果视图有子视图,就通过xib文件创建。

        4.  使用视图控制对象时,不会直接修改视图层次结构。UIWindow实现了一个名为setRootViewController:的方法。将UIViewController实例作为参数传入该方法,传入

的视图控制对象的视图会自动加入窗口,成为窗口的子视图并调整大小和窗口保持一致。窗口对象会保留它的跟视图对象。

         此处附图:

       5. 需要创建视图时,视图控制对象会调用loadView方法。创建UIViewController实例后,其下的视图不会马上被创建,要等到视图控制对象的视图加入视图层次结构后

       (即视图第一次出现在屏幕上时)才会创建。

6.创建 UIViewController子类的实例时,通过指定的初始化方法 initWithNibName:bundle:传入的XIB文件的文件名。当视图控制对象需要使用实例变量view的时候,会查看应用程序包内是否存在相应的xib文件(如果传入的名称时nil,那么UIViewController对象会查找和这个UIViewController子类的类名匹配的xib文件)。接着视图对象会载入找到的xib文件。

        7.loadView方法负责完成上述XIB载入过程。UIViewController的默认loadView方法会查找并载入XIB文件,所以在编写通过XIB文件载入视图的UIViewController子类时,不要覆盖loadView。而在编写通过代码创建视图的UIViewController子类时,就必须覆盖loadView,避免载入XIB文件。

        8.UIViewController会在特定的时刻调用一下方法。

       * viewWillAppear:当UIViewController对象的视图即将加入窗口时调用

       *viewDidAppear:当UIViewController对象的视图已经加入窗口时调用

       *viewWillAppear:当UIViewController对象的视图即将消失,被覆盖或是隐藏时调用。

       *viewDidDisappear:当UIViewController对象的视图已经消失,被覆盖或是隐藏时调用。

虽然某个UIViewController对象只会创建一次,但是他的视图通常会显示(移除或消失)多次。所以通常需要覆盖视图控制对象在这些时刻的默认行为。

UIViewController中的这些方法不做任何事情,仅供子类覆盖。

    8.和其它对象一样,视图控制对象也是通过alloc和init创建的。但是视图控制对象不会在创建的那一刻马上创建相应的视图,而是要等到真正的需要试图时,才会通过调用loadView来创建。这种延迟创建的做法能提高内存的使用效率。例如:如果某个标签条有很多UIViewController对象,那么任何一个UIViewController对象的视图,只会在相应的标签项被选中时才会被创建出来。视图控制对象会在收到view消息的那一刻载入视图。

- (UIView *)view

{

if( [self isViewLoaded] == NO)

       {

            [self loadView];

            [self viewDidLoad];

       }

      return self;


}

这段代码的作用,一旦某个视图控制对象要求获取视图试图控制对象的视图,并且该视图还不存在,那么视图控制对象就会创建一个视图。


9.视图控制对象的视图可以有子视图,其中一些子视图会作为插座变量和视图控制对象关联。当对象A和插座变量建立关联后,拥有插座变量的对象B会保留对象A。此外,因为父视图会保留他的子视图,所以A的retain计数会是2。

  当发生内存过低警告时,视图控制对象会释放它的视图。释放视图时,视图会向他的子视图发送release消息。但是视图控制对象依然保留这一个A的retain计数。

所以,在视图控制对象卸载他的视图时,应该向所有的插座变量发送release消息。否则这些变量最终会被新创建的对象替换掉。一般可以在viewDidUnload中完成这个任务。

   释放视图控制对象时,不会调用该对象的viewDidUnLoad方法(但是其视图还是会被释放),所以,是被释放的视图控制对象必须在dealloc中释放所有的插座变量。

10.  牢记:视图和它的视图控制对象时两个分开的对象。在视图控制对象的生命周期里,它的视图可以创建,在窗口中显示,从窗口中移除,释放和再次创建多次。我们可以认为视图是一种可以再生的资源,视图控制对象通过该资源与用户沟通。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部