Chapter5 : View controller & KVC - The Big Nerd Ranch Guide 读书笔记

来源:互联网 发布:桃源恋歌动作数据 编辑:程序博客网 时间:2024/05/17 23:47

View controller 相关函数

当一个view controller被创建的时候,如果view的属性是nil,那么func loadView()函数会被调用。
你可以调用init和initWithNibName等初始化函数去创建一个View controller,但是不要把任何访问view属性的操作放在这里面,因为iOS并不会去初始化一个view,直到需要显示的时候。
你可以把需要访问view的操作放在ViewDidLoad等函数里面。如果是在程序运行的时候,只需要调用一次的操作,放在ViewDidLoad里面。每次view controller显示到屏幕,都要做的操作,放在viewWillAppear里面。
各个函数调用的详细解释:

  • application: UIApplication, didFinishLaunchingWithOptions: 当app launch的时候调用,即使你跳到另一个app再回来,也不会再次调用。如果app被杀掉,会再次调用。
  • initWithNibName: 当创建一个View controller实例,会被调用一次。如果是创建同样一个view controller类的实例多次,这个函数也会被调用多次;
  • loadView:如果想要用程序来创建一个view controller的view,需要override这个函数;
  • ViewDidLoad: 如果想要configure views,这些view可能是需要载入一个xib文件,需要override这个函数。当一个view controller的view被创建的时候,这个函数会被调用
  • viewWillAppear:如果想要configure views,这些view可能是需要载入一个xib文件,需要override这个函数。每次view显示的时候被调用,view被移出屏幕的时候,会调用viewWillDisappear。

KVC Key-Value-Coding

当一个NIB文件被读进来的时候,这些outlet是通过KVC来设置。KVC是NSObject的一些方法的集合。比如:

  • valueForKey: 是一个通用的get方法,比如:
currentFido = self.valueForKey(key:@"fido")

会先找叫fido的方法,如果找到,会执行,然后返回结果给currentFido。如果没有方法叫fido,那么会找叫fido的变量。要是都找不到,那么会给出一个异常

  • setValue:forKey: 这是一个通用的setter方法:
self.setValue(userChoice, forKey:@"fido")

如果这里有一个setFido的方法,会调用这个方法,如果没有,会找叫fido的变量。然后设置变量。如果还是找不到,会抛出一个异常。

当load一个NIb文件,系统会用setValue:forKey:来设置outlet。比如,你为interface builder里的对象设置了一个outlet叫rex,那么这个对象需要有setRex方法,或叫rex的变量。如果没有,系统会抛出一个异常。
典型的,当你新建了一个outlet属性叫rex,连接到IB,然后更改了outlet的名字为rex2。系统就会报错:

KVC[913:28116] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<KVC.ViewController 0x7fdbf055bbf0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key rex.'

原因是:再连接以后,系统希望找一个叫setRex的方法,本来是outlet rex的setter。结果没找到。

Retina Display

retian屏是从iPhone 4开始的,分辨率是以前的2倍。
现在来看看对于retian屏要做什么。

  • 对于vector图像,也就是向量图,就像是画一个text,drawRect,你不需要做任何额外的事。当你用Core Graphics(也可以叫做Quartz,lines,curves,text)画图的时候,是以point为基本单位,在non-retian屏,一个point等于一个pixel,在retian屏,一个point等于两个pixel
    这里写图片描述
  • 对于bitmap图,也就是位图,如果是一个25*25pixel的图,在retian屏上会被拉扯为50*50pixel。
    这里写图片描述
    所以你要放2张图,高分辨率的加上@2x后缀。
0 0