我希望根据可用内容显示不同的UITableViewCell
。我怎样才能做到这一点?
示例:的
假设我有一个自定义UITableViewCell
,其contentView
有一个UILabel
,UITextField
和一个UIImageView
作为子视图。 UILabel
位于单元格的顶部,位于UIImageView
旁边的UITextField
上方。根据这些视图的可用内容,我只想显示可用的部分并放大其他视图。 e.G:如果缺少UILabel上下文,我不希望在单元格的顶部有空格。如果我没有图像,则文本字段应从单元格的最左侧开始。
应该有很多报纸/电视应用程序必须解决完全相同的问题......
的方法:
(i)使用相同的自定义单元格,我以某种方式重新排列子视图
(ii)根据可用内容调用不同的自定义UITableViewCell
对于这两种方法,我遇到了解决此问题的路径问题。我的UITableView
内容大小是动态的,可以有几行或多行。
我错过了其他方法,或者哪种方法是最佳做法?
答案 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:
)。