我在XIB文件中外部化了一个组件,因此我可以在几个不同的视图中重用它。 现在,在我的视图控制器中,我加载了基于XIB的UIView,并通过以下方式将其添加到当前视图中:
NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ThumbsPreviewView" owner:self options:nil];
_likePreview = [views objectAtIndex:0];
[self.view addSubview:_likePreview];
起初,我认为它不起作用......但实际上它可以工作,但只将根视图(即我所有图形组件的容器,这是透明的)放到我的视图中。
所以我需要把这种代码(对于每个子组件)都能使它工作:
[self.view addSubview:_likePreview];
NSArray *subviews = _likePreview.subviews;
for(UIView * subview in subviews) {
[self.view addSubview:subview];
}
这非常违反直觉,而且我认为它不会创建我想要的视图层次结构。
我确信有一个解决方案,因为我在UITableViewController中做同样的事情来从XIB加载自定义表头。在这种情况下使用完全相同的XIB文件可以正确加载所有内容。这是代码:
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
switch(section) {
case 0: {
NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"ThumbsPreviewView" owner:self options:nil];
_likePreview = [views objectAtIndex:0];
return _likePreview;
}
}
return [super tableView:tableView viewForHeaderInSection:section];
}
使用上面的代码,一切都很好,我得到了整个视图(=根视图容器及其所有内容)作为我的表部分的标题。
所以问题是:在我的第一个例子中我做错了什么?如何将所有内容(容器+所有内容)添加到我的父UIView作为正确的UIView层次结构?
编辑:我需要确定所有内容都在我的XIB文件中以单个根UIView组织,如下所示(我无法发布图片):
* Thumbs preview view
|_ Button
|_ Image View
|_ Image View
|_ Image View
|_ Image View
|_ Button
|_ Button
|_ Button
|_ Label
非常感谢你的帮助!
克里斯托夫答案 0 :(得分:3)
加载组件的一种方法是将组件存储到顶部UIView
对象(附带的屏幕截图)。
http://a1.img.mobypicture.com/fd182b5ba5c55fa1fba9162f395ddb98_full.jpg
然后您可以像往常一样加载您的笔尖并使用-addSubview:
将您的组件添加到视图层次结构中。
编辑:
使用
加载笔尖UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"testView" owner:self options:nil] objectAtIndex:0];
并使用
将视图添加到视图层次结构中[self.view addSubview:view];
导致以下视图hiearchy:
(lldb) po [[self view] recursiveDescription]
(id) $1 = 0x088487b0 <UIView: 0x89595b0; frame = (0 0; 320 548); autoresize = W+H; layer = <CALayer: 0x8958b30>>
| <UIView: 0x89755c0; frame = (0 0; 320 200); autoresize = RM+BM; layer = <CALayer: 0x8975080>>
| | <UIView: 0x8975620; frame = (200 20; 100 30); autoresize = W+H; layer = <CALayer: 0x8975680>>
| | <UIView: 0x8975700; frame = (20 20; 100 30); autoresize = W+H; layer = <CALayer: 0x8974ea0>>
| | <UIRoundedRectButton: 0x8975790; frame = (20 58; 73 44); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8975890>>
| | | <UIGroupTableViewCellBackground: 0x8976030; frame = (0 0; 73 44); userInteractionEnabled = NO; layer = <CALayer: 0x8976100>>
| | | <UIImageView: 0x89768d0; frame = (1 1; 71 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x89770f0>>
| | | <UIButtonLabel: 0x8977af0; frame = (36 22; 0 0); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8977be0>>
| | <UIRoundedRectButton: 0x8978990; frame = (227 58; 73 44); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x8978a60>>
| | | <UIGroupTableViewCellBackground: 0x8978a90; frame = (0 0; 73 44); userInteractionEnabled = NO; layer = <CALayer: 0x8978b10>>
| | | <UIImageView: 0x8978b80; frame = (1 1; 71 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8979230>>
| | | <UIButtonLabel: 0x8978be0; frame = (36 22; 0 0); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8978cd0>>