我正在尝试创建一个自定义UIView
,它从nib文件中引入它的视图。
在我的控制器中,我有类似的东西:
self.arcView=[[JtView alloc] initWithCoder:self];
self.arcView.backgroundColor=[UIColor redColor];
self.arcView.frame=CGRectMake(30.0f,200.0f, 100.0f, 100.0f);
[self.view addSubview:self.arcView];
我的第一个问题是initWithCoder (NSCoder *)
的论点应该包含哪些内容?我试过自己,但得到了一个不兼容的指针类型,但这似乎工作。但问题是#2:
其次,争论的焦点是,在将自定义视图放在框架中时,initWithCoder
与nibs
和initWithFrame
一起使用。好吧,我想在自定义视图中加载nib
,然后将其放入框架中。我可以像上面一样添加一个框架,它没问题(它看起来有效)?
答案 0 :(得分:9)
initWithCoder
在init
和viewDidLoad
方法之前调用很多。你永远不会打电话给它。当您从mainBundle
加载nib文件时会调用它。
但是,它接收NSCoder
作为参数。检查它在类中的调用方式:
- (id)initWithCoder:(NSCoder *)aDecoder {
if ((self = [super initWithCoder:aDecoder])) {
[self baseClassInit];
}
return self;
}
- (void)baseClassInit {
//initialize all ivars and properties
}
答案 1 :(得分:8)
你反过来说:不是你应该打电话给initWithCoder:
,而是loadNibNamed:owner:
方法的实现。
您需要在代码中执行的操作是
UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"theNIB"
owner:self
options:nil] objectAtIndex:0];
这会解开NIB,并拨打您的initWithCoder:
初始化程序,并返回所有连接的视图。
答案 2 :(得分:1)
self.arcView = [[[NSBundle mainBundle] loadNibNamed:@"JtView" owner:self options:nil] objectAtIndex:0];
self.arcView.frame = CGRectMake(30.0f,200.0f, 100.0f, 100.0f);
self.arcView.backgroundColor = [UIColor redColor];
[self.view addSubview:self.arcView];
这样可行,不要拨打initWithCoder:
。
答案 3 :(得分:1)
永远不要显式调用initWithCoder,它会在取消归档归档对象并初始化对象ivars和属性时隐式调用 - 归档对象可以是保存在持久性存储中的自定义模型类,也可以是从xib文件加载的自定义视图。
在您的课程中,您似乎正在尝试创建自定义视图,因此请从xib文件加载它,以供参考@dasblinkenlight代码是一个完美的解决方案。