iOS 5 UITableViewCell自定义XIB又称“我是否会失去理智?”

时间:2012-01-24 18:50:09

标签: iphone ios uitableview ios5

好的。我做了比我过去三年可能计算的更多自定义UITableViewCells。

然后是iOS 5,我在我的桌面上有一个项目,我还需要做更多的事情。

所以我以前的方式是做一个自定义的XIB,将UITableViewCell拖到画布上,插入我的控件,设置自定义类,做我的链接......然后在代码中加载实例化单元格解压缩XIB后循环遍历对象。

我有多次使用一个分类功能来处理整个事情。

现在,在iOS 5中突然间,每当我制作一个自定义单元时,它就会提供大的空白表格单元格。

以下是插入表格的自定义单元格的以下特征

1)除了“默认”UITableViewCell控件(textLabel等,将在我设置文本时填充和显示)时显示完全鲜明的白色。

2)isKindOfClass(MyCustomCellClass)报告为真

3)自定义单元类上的setter方法正常运行,设置值和自定义UILabel的对象指针等都报告为非零,这意味着单元格实际上正在制作并正确地从XIB实例化

4)出于某种原因,无条件地显示UIStepper等非同类控件。所以是的,如果我在自定义单元格中放置一个步进器,它会显示,但标签和图像不会。

我可以想象,默认情况下某些东西会遮挡内容视图,否则我正在创建的自定义控件不再适用于单元格的contentView(就像过去一样),而只是被扔进外太空。

例如,在iOS 4 XIB中,我曾经在制作自定义单元格时看到这一点(从Apple的iOS 5文档中拉出来):

Pulled from Apple's iOS 5 documentation

但是到目前为止,这是我在iOS 5 XIB中做同样的事情时所看到的。

enter image description here

请注意,它没有明确显示内容视图的小点线。

我对这个问题的所有诊断知识都已经筋疲力尽了。我已经尝试在运行时手动将所有自定义标签直接泵入内容视图,但即使这样也行不通。

我正在寻找任何想法。

修改

加载XIB的代码

if (cell == nil)
{
    [[NSBundle mainBundle] loadNibNamed:@"XCCodeViewCell" owner:self options:nil];
    cell = codeCell;
    self.codeCell = nil;
}

这是基于Apple的新推出的iOS 5建议后的简化版本。 XIB的所有者正确地设置为“self”类,并且codeCell正确地链接到单元格,具有正确的类和标识符。

1 个答案:

答案 0 :(得分:24)

哇,这个花了我一段时间来测试,但我想我已经找到了答案......

在界面构建器中使用Xcode4,他们添加了在界面构建器中静态设置tableViewCells的功能。当您想要设计不会更改的tableView并且您不想在代码中编写它们时,这很酷。为了方便这一点,他们设置了在IB中设置tableViewCell样式的功能,并查看它的外观。当您使用自己的子视图设计自己的单元格时,请选择“自定义”。

随着iOS 5的发展,我发现了以下内容:当我从xib加载一个单元格,然后以编程方式设置textLabel.text或其中一个标准单元格样式的其他属性时,似乎tableViewCell生成带有默认标签的标准视图,并用它覆盖您的自定义视图。因此,要保留自定义单元格子视图,您无需访问任何标准tableCell属性。

冷却。

iOS 4中的新功能还有UINib。您应该使用UINib从xibs加载tableViewCells,因为它具有缓存并且速度更快(对于tableView滚动更好)。 ARC代码如下所示:

头:

@property (nonatomic, strong) UINib * tableCellLoader;

.m文件:

-(void)viewDidLoad{
    [super viewDidLoad];
    self.tableCellLoader = [UINib nibWithNibName:@"MyTableViewCell" bundle:nil];
}

然后在tableView:cellForRowAtIndexPath:

...
if (cell == nil) {
    cell = [[self.tableCellLoader instantiateWithOwner:self options:nil] objectAtIndex:0];
}
...

编辑:更新iOS 5中的新功能 iOS 5中的新功能是UITableView能够为某些单元重用标识符保留xib,然后如果重用队列中没有任何标识符,则实例化该特定类型的新单元。

结帐

– registerNib:forCellReuseIdentifier:

然后当你做

– dequeueReusableCellWithIdentifier:

您可以保证获得指定类型的UITableViewCell。它可以帮助您自己完成UINib整个事情。