根据可用的文本或图像内容选择不同的UITableViewCells

时间:2011-08-23 13:33:53

标签: iphone ios uitableview uilabel

我希望根据可用内容显示不同的UITableViewCell。我怎样才能做到这一点?

示例:

假设我有一个自定义UITableViewCell,其contentView有一个UILabelUITextField和一个UIImageView作为子视图。 UILabel位于单元格的顶部,位于UIImageView旁边的UITextField上方。根据这些视图的可用内容,我只想显示可用的部分并放大其他视图。 e.G:如果缺少UILabel上下文,我不希望在单元格的顶部有空格。如果我没有图像,则文本字段应从单元格的最左侧开始。

应该有很多报纸/电视应用程序必须解决完全相同的问题......

的方法:

(i)使用相同的自定义单元格,我以某种方式重新排列子视图

(ii)根据可用内容调用不同的自定义UITableViewCell

对于这两种方法,我遇到了解决此问题的路径问题。我的UITableView内容大小是动态的,可以有几行或多行。

我错过了其他方法,或者哪种方法是最佳做法?

2 个答案:

答案 0 :(得分:2)

你的(ii)想法是我想到的方式。正如您所说,您设计了两个习惯UITableViewCell(。m,.h和.xib),您不要忘记在界面生成器中定义CellIdentifier以及何时调用您的委托tableView:cellForRowAtIndexPath:您选择dequeueReusableCellWithIdentifier:相应的UITableViewCell模板。

答案 1 :(得分:1)

这两种方法都有效,但我可能更喜欢(i)

对于(i),重用很简单。只需确保在重复使用时清除旧数据,让UITableViewCell的layoutSubviews方法适当地放置子视图以匹配可用的数据,并确保在更改数据时调用setNeedsLayout。这里的优点是代码的其余部分不需要关心哪些数据可用,并且您的表甚至不必关心单元格是否突然添加了图像(除非它需要知道单元格身高变了什么的)。缺点是单元的实现更复杂,并且布局不能在IB中完全定义。

对于(ii),每个不同的自定义UITableViewCell类型必须拥有自己的reuseIdentifier,然后使用dequeueReusableCellWithIdentifier:以及适用于可用数据的标识符。这里的优点是单个单元格类型更简单(并且可能完全在IB中完成),而缺点是必须为可用数据的每种可能组合中包含多个单元格。此外,如果类型需要更改,您需要让UITableView重新加载单元格(例如,使用reloadRowsAtIndexPaths:withRowAnimation:)。