我正在尝试使用两个Firebase对象阵列(称为快照)填充包含2个部分的tableView。当我尝试加载tableView:fatal error: Index out of range
时,我的cellForRowAtIndexPath函数出错了。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("PersonCell", forIndexPath: indexPath) as! PersonCell
//set cell text
let guardianDict = guardians[indexPath.row].value as! [String : AnyObject] // error happens here
let dependentDict = dependents[indexPath.row].value as! [String : AnyObject]
cell.personName.text = "test"
return cell
}
以下是我定义各个部分的方法:
override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
switch(section){
case 0: return "Dependents"
case 1: return "Guardians"
default: return ""
}
}
有什么想法吗? 谢谢!
编辑:添加numberOfSections和numberOfRowsInSection:
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 2
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
switch(section){
case 0: return self.dependents.count
case 1: return self.guardians.count
default: return 1
}
}
答案 0 :(得分:2)
您的表格中有两个部分,每个部分来自不同的来源。您需要在cellForRowIndexPath函数中添加检查才能访问正确的数组:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("PersonCell", forIndexPath: indexPath) as! PersonCell
if indexPath.section == 0
{
let dependentDict = dependents[indexPath.row].value as! [String : AnyObject]
}
else if indexPath.section == 1
{
let guardianDict = guardians[indexPath.row].value as! [String : AnyObject] // error happens here
}
cell.personName.text = "test"
return cell
}
答案 1 :(得分:0)
您的两个数组可能大小不同,因此在cellForRowAtIndexPath
中,您需要检查要返回单元格的哪个部分,并且只能访问相应的数组。目前,每次调用此函数时都要访问这两个数组,当其中一个数组小于另一个数组时,会导致索引超出范围异常。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("PersonCell", forIndexPath: indexPath) as! PersonCell
if indexPath.section == 0 {
let dependentDict = dependents[indexPath.row].value as! [String : AnyObject]
cell.personName.text = dependentDict["name"] as! String //Or whatever element in the dictionary is needed
} else {
let guardianDict = guardians[indexPath.row].value as! [String : AnyObject]
cell.personName.text = guardianDict["name"] as! String //Or whatever element in the dictionary is needed
}
return cell
}