我正在创建一个应用程序,要求用户点击多个单元格以便选择它们。当他们点击一个单元格时,会出现一个.Checkmark附件项目。出于某种原因,虽然每当我尝试进入该VC时,应用程序崩溃,我在第8行收到以下错误消息(if!checked [indexPath.row]):
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let cell: InstrumentTableCell! = tableView.dequeueReusableCellWithIdentifier(identifier) as? InstrumentTableCell
cell.configurateTheCell(recipies[indexPath.row])
if !checked[indexPath.row] {
cell.accessoryType = .None
} else if checked[indexPath.row] {
cell.accessoryType = .Checkmark
}
return cell
}
这是我的工作检查方法:
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
tableView.deselectRowAtIndexPath(indexPath, animated: true)
if let cell = tableView.cellForRowAtIndexPath(indexPath) {
if cell.accessoryType == .Checkmark {
cell.accessoryType = .None
checked[indexPath.row] = false
} else {
cell.accessoryType = .Checkmark
checked[indexPath.row] = true
}
}
}
答案 0 :(得分:3)
您的问题是,在调用checked
时,您只在<{1}}数组中存储项目。但是,只有在实际选择行时才会调用该方法。
tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
。
所以,当你在tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
问:
cellForRowAtIndexPath
然后你不能确定if !checked[indexPath.row]
实际上包含任何东西。例如,第一次开始渲染单元格时,checked
数组不包含任何值,因此当您要求某个位置上的值没有值时,它会崩溃。
一种解决方案可能是初始化您的checked
数组以包含所有checked
值。我猜你有一些名为false
的模型数组,所以你可以这样做:
recipies
或者正如@AaronBrager在下面的评论中所建议的那样(这样更漂亮:))
for (index, _) in recipies.enumerate() {
checked.append(false)
}
通过这种方式,您可以确保已使用与收件人相同数量的元素正确初始化已检查的数组。
另一种选择可能是让checked = Array(count:recipies.count, repeatedValue:false)
中的各个元素知道它们是否被检查。
希望这有意义并帮助你。