混淆了initWithCoder和自定义UIViews

tim*_*one 9 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];
Run Code Online (Sandbox Code Playgroud)

我的第一个问题是应该进入论证的内容initWithCoder (NSCoder *)?我试过自己,但得到了一个不兼容的指针类型,但这似乎工作.但问题#2:

其次,说法是,你用initWithCodernibs,并initWithFrame把您的自定义视图帧时.好吧,我想nib在我的自定义视图中加载一个然后将其放入框架中.我可以像上面一样添加一个框架,它没问题(它看起来像是有效的)?

Ano*_*dya 9

initWithCoder以前被称为initviewDidLoad方法.你永远不会打电话给它.当你从你的文件中加载一个nib文件时会调用它mainBundle.

然而,它NSCoder作为一个参数收到.检查它在类中的调用方式:

- (id)initWithCoder:(NSCoder *)aDecoder {
    if ((self = [super initWithCoder:aDecoder])) {
        [self baseClassInit];
    }
    return self;
}

- (void)baseClassInit {

    //initialize all ivars and properties    
}
Run Code Online (Sandbox Code Playgroud)


das*_*ght 8

你正在以相反的方式做到这一点:不是你应该打电话的人initWithCoder:,而是实现它的loadNibNamed:owner:方法.

您需要在代码中执行的操作是调用

UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"theNIB" 
                                              owner:self 
                                            options:nil] objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

这将解开NIB,并调用您的initWithCoder:初始化程序,并返回一个连接所有插座的视图.