[[NSBundle mainBundle] loadNibNamed:(NSString *) owner:(id) options:(NSDictionary *)];
那我就来说说这个函数内部, 苹果官方解析的相信过程吧
为了方便解释, 我还是附上图片吧
- (NSArray *)loadNibName(NSString *)name owner:(id)owner options:(NSDictionary *)options
{
// 首先会相信解析name.xib下的所有Object对象 (xib其实是xml 文件)
创建name.xib下的Object所以对象
这里我就已第一个对象View来模拟xib的解析
解析View的各个属性来创建第一个“我是按钮”所在的这个UIView
解析过程如下:
// 创建一个View
UIView *view = [[UIView alloc] init];
// 设置view的各个属性
view.backgroundColor = [UIColor blueColor];
......
// 创建一个按钮
UIButton *button = [[UIButton alloc] init];
// 设置按钮各个属性
...
// 添加按钮到view上
[view addSubview: button];
// 创建其他的两个控件并解析控件设置其属性
}
注意: 上面那个函数返回的是一个数组, 所以需要用到那个对象注意其下标
通过上面那个函数只是简单的加载xib视图, 要想对里面的控件进行拖线, 或者监听 就要设置xib里面的File's Owner
现在我先来说一下设置File's Owner前后的差别吧, 为此, 我先创建一个UIView的类来供“我是按钮”所在的这个UIView连线使用, 并且给这个类声明并实现了对象方法 - (IBAtion)buttonCilck; 如图
现在设置xib的File's Owner的Custom Class的实力对象为我们创建的MyView, 并且通过连线监听按钮点击
如下图代表连线成功 , 就可以监听按钮点击事件了
然后通过在ViewController.m文件的- (void)viewDidLoad 方法写 代码加载xib
现在我来演示一个初学者常见的错误
注意: 上图箭头所指的owner 并不是我们xib里面的File's Owner, 当前为nil; 现在运行程序, 程序可以正常运行, 但是点击“我的按钮”, 程序就立马崩溃了
因为当前按钮已经有点击事件了, 点击按钮时, 会调用owner的buttonClick方法, 当前owner为nil 所以会出错
因为owner的类型为(id),所以这里我创建一个Dog类来监听点击, 并让Dog类声明和实现- (IBAtion)buttonClick;方法
, 然后通过设置File's Owner的Custom Class的class为 Dog使我们的狗可以监听按钮点击
然后创建一条狗dog 并令owmer的参数为dog
然后运行程序(command + R)
运行后,点击按钮还是会崩溃,这次显示的原因和上次一样,并不是我们这个方法错了, 而是我们创建的这条是局部变量,这个函数运行完就销毁了, 所以我们要给控制器设置一个dog属性,来解决这个问题
现在运行程序就不会有问题了,点击一下按钮 狗就会监听到 输出 汪汪汪.....
现在我来总结一下File's Owner的使用步骤
1> 在xib中设置File's Owner的class 属性(目的是为了在xib中能找到owner的方法)
2> 建立File's Owner跟控件之间的联系(拖线)
3> 利用代码加载xib, 传递owner的参数(类型一定要与File's Owner的class 一致)
如果还有不清除的可以留言,评论, 如果我有空会尽量给大家解答的!
如果需要源代码,可在如下百度云链接下载:
链接: http://pan.baidu.com/s/1sj3LwxJ 密码: 9g6w
好了,大概也就这些了,谢谢你们的阅读! 你们的评论是对我最大的鼓励! 谢谢