7

我试图用许多相同的子视图填充滚动视图,但数据更改除外。如果我想以编程方式完成整个事情,我可以像这样:

int width = 110;
int count = 0;
self.scrollView.contentSize=CGSizeMake(width*[items count],100);

for (NSString *id in items) {
    Item *item = [items objectForKey:id];
    CGRect frame = CGRectMake(count*width, 0, 100, 100);
    UIView *itemSubview = [[UIView alloc] initWithFrame:frame];

    CGRect dataLabelFrame = CGRectMake( 0, 52, 35, 30 );
    UILabel* dataLabel = [[UILabel alloc] initWithFrame: dataLabelFrame];
    dataLabel.text = @"Data specific to item"; // item.property or something
    dataLabel.font:[UIFont systemFontOfSize:30];
    dataLabel.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0];

    [itemSubview addSubview:dataLabel];
    [self.scrollView addSubview:itemSubview];
    [itemSubview release];
}

都好。现在,如果我的 subView 稍微复杂一点,并且我想用 Interface Builder 和 xib 存档来布置它,我该如何做同样的事情?到目前为止,我有:

  • 创建了我自己的自定义视图代码 ItemSubview,使用 IBOutlet NSString *dataLabel 扩展 UIView
  • 创建了我的 xib 文件,将文件的所有者设置为 ItemSubview 类,并将我的标签连接到插座

然后,在代码中:

int width = 110;
int count = 0;
self.scrollView.contentSize=CGSizeMake(width*[items count],100);

for (NSString *id in items) {
    Item *item = [items objectForKey:id];
    CGRect frame = CGRectMake(count*width, 0, 100, 100);
    ItemSubview *itemSubview = [[ItemSubview alloc] initWithFrame:frame];
    [itemSubview setBackgroundColor:[UIColor colorWithRed:0.0 green:0.2 blue:0.0 alpha:0.2]]; // to see where it ends up

    [[NSBundle mainBundle] loadNibNamed:@"ItemSubview" owner:itemSubview options:nil];
    itemSubview.dataLabel.text = @"Data specific to item"; // item.property or something
    [self.scrollView addSubview:itemSubview];
    [itemSubview release];
}

当我这样做时,我的 itemSubview 被绘制(我可以看到 itemSubview 的背景颜色),但不是 xib 存档中的 dataLabel。我错过了什么/不理解什么?为什么这是以编程方式工作,而不是使用 xib 文件?

4

1 回答 1

8

像这样做:

    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"ItemSubview" owner:self options:nil];
    ItemSubview *itemSubview = [topLevelObjects objectAtIndex:0];

确保在您的 xib 文件中,顶级视图属于 ItemSubview 类,并且 dataLabel 已正确连接到 ItemSubview 的插座。文件的所有者应留空。

于 2012-08-31T05:26:36.523 回答