【问题标题】:iOS: how to create views programatically using XIB, but without using View ControlleriOS:如何使用 XIB 以编程方式创建视图,但不使用视图控制器
【发布时间】:2012-08-25 21:52:02
【问题描述】:

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

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 文件?

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    这样做:

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

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

    【讨论】:

    • 这有帮助。 itemSubview 来自带有背景和大小的 xib,但它仍然没有显示它的 dataLabel 子子视图。 (甚至没有在 xib 中设置的默认值。)文件的所有者是空白的,并且 dataLabel 的出口连接到 itemSubview(这是 xib 中唯一的顶级对象)。调试器说标签在那里,具有正确的值,但它没有出现在屏幕上。嗯...
    • 这很奇怪。我注意到您写的 ItemSubview 类有一个 IBOutlet,它是一个 NSString*。那不应该是 UILabel* 吗?我认为这可能只是问题中的一个错字。你可以试试这个:完全删除 xib 文件,重新启动 Xcode 并重新创建 xib 文件。有时 Xcode 会变得一团糟。除此之外,也许发布您用于添加子视图、ItemSubview 类和您的 xib 文件设置的图像的确切代码。
    • 我的问题,原来是 [itemSubview 版本]。所以,去掉那个,一切都很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多