UITableView有不同的可选部分?

时间:2015-07-31 07:59:17

标签: ios swift uitableview

我正在寻找解决某些特殊要求的“好方法”:

我有一个带有不同部分的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个部分。还有另一种更好的方法吗?我可以手动创建部分吗?如果是的话,我应该吗?这样只有基类可见,如果有可用的数据,则附加其他所有内容。

1 个答案:

答案 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
    }
}