UITableView的最佳数据源配置

时间:2017-07-01 17:29:46

标签: ios swift uitableview cocoa-touch

我有一个数组

    secInfArr = []
    let secInf1 = SecInfObj.init()
    secInf1.selected = true
    secInf1.itemName = "item1"
    secInf1.sectionName = "section3"
    secInfArr.append(secInf1)

    let secInf2 = SecInfObj.init()
    secInf2.selected = true
    secInf2.itemName = "item1"
    secInf2.sectionName = "section1"
    secInfArr.append(sectionInfo2)

    let secInf3 = SecInfObj.init()
    secInf3.selected = true
    secInf3.itemName = "item1"
    secInf3.sectionName = "section1"
    secInfArr.append(secInf3)

    let secInf4 = SecInfObj.init()
    secInf4.selected = false
    secInf4.itemName = "item1"
    secInf4.sectionName = "section2"
    secInfArr.append(secInf4)

我希望创建一个tableView,其中所有内容都按sectionName属性进行分组,并且该部分中的所有itemName按字母顺序排序。

到目前为止,我正在做我认为效率低下的事情。我正在对数组中的Distinct属性执行sectionName操作,然后使用它来命名节并计算它们。之后,在CellForRowAtIndexPath方法中,我只使用sectionName过滤数组,然后添加单元格。

我还想过使用NSFetchedResultsController,但我认为这不是一个好主意,因为数据本质上并不持久,因此不需要在managedObject表格。

在这种情况下,为分组表视图构建数据的理想方法是什么?

2 个答案:

答案 0 :(得分:2)

我推荐一个面向对象的解决方案,例如一个带有name属性和items数组的结构,这里是通用形式。

struct Section<T> {

    let name : String
    var items = [T]()

}

如果经常变异items数组,请使用class而不是struct来利用引用语义。

填充数据源时,将SecInfObj个对象分配给相应的Section实例。

可以轻松对项目进行排序,您可以声明数据源

var data = [Section<SecInfObj>]()

numberOfRows返回

return data[section].items.count

您可以使用

按索引路径获取该部分
let section = data[indexPath.section]

然后带

的项目
let items = section.items[indexPath.row]

答案 1 :(得分:0)

我建议根据章节将它们分别放入不同的数组中。在数据源中调用要容易得多,尤其是numberOfRowsInSectioncellForRowAt方法。 UITableView也很容易为每个单元格获取数据,因为它可以通过索引直接访问数组。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if section == 0 {
        return items0.count
    }
    else if section == 1 {
        return items1.count
    }
    return 0
}

或者也可能类似于下面。如果全部分别进入items[0] ... items [n]

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return items[section].count
}