我正在使用Storyboard并尝试将View重用于不同的ViewControllers。
为此,我创建了一个自定义.xib(MyCustomView.xib
)和类(MyCustomView
),几乎无处不在。
在我的Storyboard中,我将自定义视图设置为MyCustomView
类型。
在MyCustomView.xib
中,将第一响应者设置为MyCustomView
。
在MyCustomView.m
中,我添加了以下方法:
-(id)initWithCoder:(NSCoder *)aDecoder{
if ((self = [super initWithCoder:aDecoder])){
UIView *myCustomView = [[[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil] objectAtIndex:0];
[self addSubview: myCustomView];
}
return self;
}
问题是,[self addSubview: myCustomView]
向现有MyCustomView
添加了新的MyCustomView
,因此视图会被添加两次。
我怎样才能摆脱其中一个?
修改
我的问题不是很清楚,所以我认为一些屏幕上限会有所帮助。
这是我的故事板,带有自定义视图。自定义类设置为MyCustomView
。
(我还添加了灰色背景和标签,仅用于测试目的)
现在,在MyCustomView.xib
中,我将文件的所有者设置为类MyCustomView
:
为标题Label和imageView添加插座:
使用上面写的initWithCoder方法,这工作正常,除了我调试时我可以看到:
因此,self
当然是类型MyCustomView
,如故事板中所选,但它包含2个子视图:
MyCustomView.xib
的视图,其中包含标签和图像视图。 这就是我想要摆脱的观点。答案 0 :(得分:0)
什么是 self ?
在这里,您刚刚实例化了MyCustomView。因此,您要将新的UIView(而不是MyCustomView)添加到由 initWithCoder 方法创建的新MyCustomView实例中。
initWithCoder 是加载Storyboard视图时调用的方法。
如果要在MyCustomViewController 中实例化新的MyCustomView ,则必须调用
MyCustomView *newInstance = [[MyCustomView alloc] init];
[self addSubview:newInstance];
其中 self 是故事板中MyCustomViewController的实例。
修改强>
好的,我更了解你的问题。 如果要加载MyCustomView nib文件,则无需为其创建类(除非您要在其中访问特定变量)。 只是做你在这里做的事情,但在视图控制器中,它将是 self 。 :)
您可能需要查看:How to load a UIView using a nib file created with Interface Builder
编辑2
好的,我想我明白了:
self 将是MyView(出现在Storyboard中),MyCustomView不会出现在故事板中,而是以编程方式在MyView.h的init方法中创建
您必须以编程方式添加约束。以下是可能有用的帖子:Adding View Programatically With Auto Layout Gives 'NSGenericException', reason: 'Unable to install constraint on view