我是Swift的初学者,至少了解了如何填充UITableView的基础知识。我现在被困在用字典提供的数据填充多个部分。
我有一个多维字典,可以将对象分配到类别:
var categoryDict:[String:[AnyObject]] = ["Category A": ["Object 1","Object 2"], "Category B":["Object 3"]]
现在我想填充我的TableView,以便显示如下内容:
A类
B类
到目前为止,我能够创建一个类别数组来返回节的数量,并计算存储在字典中的数组,以获得每个特定类别中的行数。现在我完全陷入了使用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
}
答案 0 :(得分:2)
首先:字典是存储表格视图内容的不良选择。字典本质上是无序的,因此您必须对键进行排序。如果您的数据超出了少量项目,那么排序过程将需要相当长的时间。
如果您打算使用字典,您应该重构代码,以便保留已排序的密钥并反复使用它们,除非字典发生变化。我会这样做,以便您在字典中添加一个setter方法,并始终使用该setter来更改字典。 setter方法将重新生成已排序的键。这样,如果字典发生变化,您只需对键进行排序。 (但最好完全摆脱字典。)
我建议创建一个包含sectionTitle Section
和String
数组的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
}