2、xib以及设置它的owner
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor blueColor];
self.viewV.backgroundColor = [UIColor grayColor];
self.viewV = [[[NSBundle mainBundle] loadNibNamed:@"ViewView" owner:self options:nil]firstObject];
self.label.text = @"nihaoya";
// [self.viewV addSubview:self.label];
[self addSubview:self.viewV];
NSLog(@"zhixing");
}
return self;
}
在owner类的代码文件中写入上面的代码进行初始化,这样我们在(使用view的时候就可以直接获取到view。(也就是上中国面的view实现绑定xib在对应的view)
上面的这种方式进行定义界面的工具的时候出现错误:
如下:
原自定义控件出现[super initWithCoder:aDecoder]崩溃问题解决
今天尝试了一下autolayout与storyboard/xib来做UI,用起来还是感觉蛮得心应手的,再也不用担心写繁琐的UI代码了。故此也打算今后用xib来实现自定义控件(UIView Subclass),不料在做一个小例子的过程中遇到一个崩溃问题,崩溃位置发生在[super initWithCoder:aDecoder]的地方。
查看崩溃时的调用堆栈,竟然有很多个initWithCoder:函数,感觉像是无限循环递归调用一样。根据这篇文章的答案,才发现是因为自己将xib中view的Custom Class设置为ChildView(自定义控件的名称,继承于UIView)。
实际上只需要将xib中File's Owner设置为ChildView就行了。
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIView 0x7f9b19d56800> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key midTitle.'
所以,不要搞混淆了。
3、使用声明为class的时候是使用,这里使用的是类方法。
+ (ViewView *) viewViewWithTitle:(NSString*)title{
ViewView *viewView = [[[NSBundle mainBundle] loadNibNamed:@"ViewView" owner:nil options:nil] firstObject];
viewView.translatesAutoresizingMaskIntoConstraints = NO;
viewView.labelView.text = title;
return viewView;
}
这个和我们经常使用的tableView中的代码重用设置的方式是一样的。
正是由于view界面的独立:我们经常会写代码文件+xib文件来写一些界面的工具,或者说是空间。写工具的时候,我们直接继承控件就好,eg:UIView,UIButton等等。
eg:类似tableView这样的或者IBinspectable这个关键字来实现在xib或者storyboard中设置显式设置属性。
不过我们经常也是会使用controller 直接创建以来的界面,所以vc就是一起的,view也就是一个单独的xib或者使用storyboard来实现都是可以的。
这个时候需要相应的方法实现初始化controller和view的xib界面进行绑定,也就是初始化的init……方法
这个方式进行初始化的时候可以查看链接如下:
http://blog.csdn.net/lvmaker/article/details/27177113
UIView中我们使用约束来进行对界面的拉伸,我们需要注意的有的时候拉伸应该多点关注约束的权限的优先级,
还有UIScrollView中我们拉伸约束的时候,注意放一个UIView在里面当contentView,这样就比较明显了。
还有今天突然明白了:UITableView其实就是UIScrollView,UIScrollView 其实就是UIView,也即是从子到父亲的关系,从复杂到简单的关系。