Swift - 使用多维数组中的多个部分填充TableView

时间:2016-03-20 11:55:57

标签: ios swift uitableview

我是Swift的初学者,至少了解了如何填充UITableView的基础知识。我现在被困在用字典提供的数据填充多个部分。

我有一个多维字典,可以将对象分配到类别:

var categoryDict:[String:[AnyObject]] = ["Category A": ["Object 1","Object 2"], "Category B":["Object 3"]]

现在我想填充我的TableView,以便显示如下内容:

  • A类

    • 对象1
    • 对象2
  • B类

    • 对象3

到目前为止,我能够创建一个类别数组来返回节的数量,并计算存储在字典中的数组,以获得每个特定类别中的行数。现在我完全陷入了使用section和rows填充TableView的问题。我怎样才能做到这一点?非常感谢你!

到目前为止我的代码:

var categoryList:[String] = [String]()
var categoryDict:[String:[AnyObject]] = ["Category A": ["Object 1","Object 2"], "Category B":["Object 3"]]


func getLists() {
    categoryList = Array(categoryDict.keys)
    categoryList.sortInPlace(before)
}

// Sort Array
func before(value1: String, value2: String) -> Bool {
    return value1 < value2;
}

func getNumberOfEntrysInSection (Section: Int) -> Int {

    let category:String = categoryList[Section]    //Get Category for Index in CategoryList

    let value:[AnyObject] = categoryDict[category]! //Get Value for this specific Category

    let number = value.count

    return number
}


// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    getLists()
    return categoryList.count
}


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return getNumberOfEntrysInSection(section)
}


override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return categoryList[section]
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("BufferCell", forIndexPath: indexPath)

    ???
    return cell
}

1 个答案:

答案 0 :(得分:2)

首先:字典是存储表格视图内容的不良选择。字典本质上是无序的,因此您必须对键进行排序。如果您的数据超出了少量项目,那么排序过程将需要相当长的时间。

如果您打算使用字典,您应该重构代码,以便保留已排序的密钥并反复使用它们,除非字典发生变化。我会这样做,以便您在字典中添加一个setter方法,并始终使用该setter来更改字典。 setter方法将重新生成已排序的键。这样,如果字典发生变化,您只需对键进行排序。 (但最好完全摆脱字典。)

我建议创建一个包含sectionTitle SectionString数组的sectionEntries对象。然后使表视图数据成为Section对象的数组。

但是,由于您有字典,我将向您展示如何使该代码有效。

您需要cellForRowAtIndexPath方法的帮助。你快到了。您只需使用indexPath部分和行获取数据结构中的相应条目。像这样:

override func tableView(tableView: UITableView, 
  cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{

    let cell = tableView.dequeueReusableCellWithIdentifier("BufferCell",
     forIndexPath: indexPath)
    let section = indexPath.section 
    let row = indexPath.row

    let categoryKey:String = categoryList[section]   
    let aCategoryEntry:[String] = categoryDict[categoryKey] as! [String]
    let anObject = aCategoryEntry[row] //
    let cell.textLabel.text = anObject
    return cell
}