我正在寻找解决某些特殊要求的“好方法”:
我有一个带有不同部分的UITableView,例如:
基础数据始终包含值(但仍有可变行数) - 所有其他“类别”可能包含行,或者仍然可以为空。如果没有数据,则不应显示该类别。
我的第一个想法是解决这个问题:
创建所有可能的类别(但可能是20或更多) - 并执行类似的操作:
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
var count:Int = 0
switch (section) {
case 0:
count = baseHeaders.count
case 1:
if(mapItem.courses?.count > 0) {
count = mapItem.courses!.count
}
break;
default:
count = 0
}
return count
}
如果计数为空,则检查: titleForHeaderInSection ,然后返回该部分没有标题。
但是:这是一个好方法吗?我关注的是创建20个部分,只使用2个部分。还有另一种更好的方法吗?我可以手动创建部分吗?如果是的话,我应该吗?这样只有基类可见,如果有可用的数据,则附加其他所有内容。
答案 0 :(得分:2)
这看起来像我接近这些问题的方式。我正在使用枚举(Obj-C&特别是Swift)来处理和识别我的章节,并且我总是返回完整数量的潜在部分:
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return FormSection.count // enum function
}
但是,在func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
中,我通过返回0行来关闭未使用的部分。
我在使用您的动态表类型后所看到的好处是,所有部分始终处于相同的索引,这使得单元格管理相对容易:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let section:FormSection = FormSection(rawValue:indexPath.section)!
switch section {
case .Header:
//…
default:
//…
}
}
部分页眉/页脚也是如此:
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
switch section {
case FormSection.Header.rawValue:
return nil
case FormSection.RoomSetup.rawValue where foo == false:
return nil
default:
// return header with title = FormSection(rawValue: section)?.headerTitle()
// Swift enums ftw ;)
}
在运行时计算/获取行数:
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let section:FormSection = FormSection(rawValue:section)!
switch section {
case .Section1:
return fooExpanded ? (numberOfFoo) : 0
case .Section2:
return model.barCount()
default:
return 1
}
}