混淆了initWithCoder和自定义UIViews

时间:2013-03-01 03:21:36

标签: ios ios6

我正在尝试创建一个自定义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:

其次,争论的焦点是,在将自定义视图放在框架中时,initWithCodernibsinitWithFrame一起使用。好吧,我想在自定义视图中加载nib,然后将其放入框架中。我可以像上面一样添加一个框架,它没问题(它看起来有效)?

4 个答案:

答案 0 :(得分:9)

initWithCoderinitviewDidLoad方法之前调用很多。你永远不会打电话给它。当您从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代码是一个完美的解决方案。