9

我正在尝试创建一个自定义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 *)?我尝试了 self 但得到了不兼容的指针类型,但这似乎有效。但是关于问题#2:

其次,论点是您在将自定义视图放入框架时initWithCoder使用nibs和。initWithFrame好吧,我想nib在我的自定义视图中加载一个,然后将它放入一个框架中。我可以像上面那样添加一个框架就可以了(看起来它可以工作)?

4

4 回答 4

9

initWithCoder被调用了很多之前initviewDidLoad方法。而你永远不会调用它。当您从mainBundle.

但是,它NSCoder作为参数接收。检查它是如何在类中调用的:

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

- (void)baseClassInit {

    //initialize all ivars and properties    
}
于 2013-03-01T03:25:59.650 回答
8

您正在以相反的方式进行操作:应该调用的不是您initWithCoder:,而是执行此操作的loadNibNamed:owner:方法的实现。

您需要在代码中做的是调用

UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"theNIB" 
                                              owner:self 
                                            options:nil] objectAtIndex:0];

这将解开NIB,并调用您的initWithCoder:初始化程序,并为您提供所有已连接插座的视图。

于 2013-03-01T03:26:07.433 回答
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:.

于 2013-03-01T03:45:41.540 回答
1

永远不要显式调用 initWithCoder,它会在取消归档归档对象并初始化对象 ivars 和属性时隐式调用 - 归档对象可以是保存在持久性存储中的自定义模型类或从 xib 文件加载的自定义视图。

在您的课程中,您似乎正在尝试创建自定义视图,因此请从 xib 文件中加载它,以供参考 @dasblinkenlight 代码是一个完美的解决方案。

于 2017-11-08T16:44:55.717 回答