xib文件本身可以看做是一个xml,app启动的时候会根据xml构造xib对应的界面及其控件,
file's owner 可以看做是 xib对应的类,比如 view对应的xib文件的file'owner对应的就是 viewcontrol的类,
outlet是针对xib文件中希望能够在外部引用的控件成员,
那么为什么要做outlet与file's owner 之间的连线呢?
这里file's owner 看做我们定义的类,即我们的代码,里面写了哪些需要outlet的控件,
但是,具体它对应与界面上哪个控件呢,这个对应关系是没有的,于是我们通过
file's owner 和 label之间的连线,确定了 我们代码中的outlet控件与 xib中的控件的
对应。类似与 mfc中,我们定义了一个成员,这个成员与界面上的某个控件对应。
同样的道理,我们虽然在 viewcontrol中 定义了 ibaction,即 事件响应的代码,却未将其与
实际的 ui的事件相关联,于是我们通过连线,将事件与代码中的响应处理对应起来。
outlet连线:control点击file's owner 拖拉到 相应控件 弹出菜单,选择 outlet名称
action连线:点击控件,在其事件列表中选择要处理的,拖拉到file's owner。
对xib/nib, file's owner, first responder的理解
iphone开发广义上来讲,采用mvc模型,即model-view-controller。其中:
model为数据模型,比如用户配置文件;
view为显示的界面元素,比如一个按钮;
controller为控制器,是model和view之间进行沟通的桥梁。其中view和model之间不会直接通信,即model只能与controller之间进行彼此通信,view只能与controller之间进行通信。
在简单的app中,可以没有model,为了简单起见,本文不设计model。
现在假设有两个独立的视图cnview和enview,cnview和enview上分别有个button和label,对于cnview,一点击button,label则显示“您好”,对于enview则显示“hello”。下面基于这个例子来回到我们的重点。
1. xib文件的理解
通过ib设计的cnview和enview分别对应一个xib文件,在cnview的xib文件中,主要采用xml格式描述了button和label控件的属性(这里不考虑view本身的背景等属性),有个button和label,以及button和label的位置、大小等。enview的xib文件类似。
2. viewcontroller
每个view对应有个视图控制器(多个view可以采用同一个视图控制器,后边再说),可以看做mvc中的c(尽管严格意义上不是),比如:cnview界面点击按钮之后的响应动作是由viewcontroller来实现的。
3. xib和viewcontroller之间的关系
xib是表现,viewcontroller一方面响应xib上的操作(比如点击、滑动等),同时也控制xib的显示。
4. file's owner
重点就是这里了,view和viewcontroller之间的对应关系,需要一个桥梁来进行连接的(即,对于一个视图,他如何知道自己的界面的操作应该由谁来响应),这个桥梁就是file's owner。
选中某个xib的file's owner,在inspector中可以看到属性:file name和custom class,该file's owner就是用来绑定file name中的xib文件和custom class中的viewcontroller的,在做了这个绑定之后,按住control键,拖动file's owner到xib中的某个控件的时候,就是custom class中定义的iboutlet元素与xib中元素进行连接的过程,同样,拖动"xib中的控件的动作"到file's owner的时候,就是将xib中该动作的响应与custom
class中某个ibaction进行连接的过程。
因此,在存在多个xib文件的情况下,即:有多个view,那么每个view可以采用不同的viewcontroller,也可以全部采用相同的一个viewcontroller,通过file's owner进行关联即可。
其实,file's owner就是custom class类型的对象,而xib中的其他元素都是该对象的成员变量,但是需要手动来关联custom class中的成员变量与xib中对象之间的关系。
5. first responder
view中每次只会有一个对象与用户进行交互,那么当前交互的对象即为first responder。比如点击文本框,那么此时文本框就是first responder。
在iphone开发中,输出口和操作是比较重要的概念,在编辑iphone界面的时候,通过可视化工具,处理界面相关控件的布局,但并不能通过可视化工具实现对控件的修改和控件发出的操作,要完成这两件事情就要分别通过输出口和操作来实现。
输出口
输出口就是我们需要在代码里操作的控件。在nib文件中,通过可视化操作来定义一个控件,如果这个控件需要在代码中被修改,那么就要定义一个输出口指向这个控件,然后通过输出口来修改这个控件,输出口也就是一个指针指向了nib中的控件对象。输出口使用关键字iboutlet声明,类似下面一行代码定义一个标签输出口:
@property (nonatomic, retain) iboutlet uilabel* mylabel;
我们希望定义一个标签,在代码里需要更改这个标签的内容,这样就要象上面那样通过关键字iboutlet声明为输出口,然后在interface builder中把这个输出口和相应的标签关联,就可以在代码里通过这个输出口操作标签了。
操作
操作就是触发一个控件后这个控件执行的方法。我们要添加一个按钮,当你想在点击这个按钮的时候改变屏幕的颜色,这时就需要定义一个操作改变屏幕颜色,然后在nib文件中把操作跟这个按钮关联起来,当你点击这个按钮的时候就会调用关联的操作方法了。通常情况下操作方法的声明如下:
- (ibaction)dosomething:(id)sender;
关键字ibaction告诉inerface buileder此方法是一个操作方法,可以被某个控件触发。方法名dosomething可以为任意的你自己定义。返回值必需是ibaction,其实它类似于void返回值不返回值。操作方法接受一个参数(id)sender,控件触发了操作后就把自己传给sender,这样在操作方法里就可以根据sender得到触发控件的信息。