我有一个像这样的表格视图:
当用户点击一行时,我想取消选中最后一行并检查所选行。所以我写了这样的代码: (例如我的lastselected = 0)
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var lastIndexPath:NSIndexPath = NSIndexPath(forRow: lastSelected, inSection: 0)
var lastCell = self.diceFaceTable.cellForRowAtIndexPath(lastIndexPath) as! TableViewCell
var cell = self.diceFaceTable.cellForRowAtIndexPath(indexPath) as! TableViewCell
lastCell.checkImg.image = UIImage(named: "uncheck")
cell.checkImg.image = UIImage(named: "check")
lastSelected = indexPath.row
}
当我点击一行而不滚动时,每件事情都很好。我意识到当我运行代码并立即滚动表并选择一行时。我的程序会因错误而崩溃: "致命错误:在展开可选值"
时意外发现nil错误显示在这一行:
我不知道这里有什么问题?
答案 0 :(得分:5)
因为当您尝试选择不在屏幕上的单元格时使用可重复使用的单元格,应用程序将崩溃,因为内存中不再存在单元格,请尝试以下操作:
if let lastCell = self.diceFaceTable.cellForRowAtIndexPath(lastIndexPath) as! TableViewCell{
lastCell.checkImg.image = UIImage(named: "uncheck")
}
//update the data set from the table view with the change in the icon
//for the old and the new cell
如果单元格当前在屏幕中,则此代码将更新复选框。如果在重新使用单元格(dequeuereusablecellwithidentifier
)时当前不在屏幕上,则应在显示之前正确设置它。为此,您需要更新表视图的数据集以包含更改。
答案 1 :(得分:0)
更好的方法是存储整个indexPath。不仅是排。尝试一次,我认为这将有效。我在其中一个应用程序中遇到了同样的问题。
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
var lastCell = self.diceFaceTable.cellForRowAtIndexPath(lastSelectedIndexPath) as! TableViewCell
var cell = self.diceFaceTable.cellForRowAtIndexPath(indexPath) as! TableViewCell
lastCell.checkImg.image = UIImage(named: "uncheck")
cell.checkImg.image = UIImage(named: "check")
lastSelectedIndexPath = indexPath
}
编辑:或者你可以试试这个。
func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
var lastCell = self.diceFaceTable.cellForRowAtIndexPath(indexPath) as! TableViewCell
lastCell.checkImg.image = UIImage(named: "uncheck")
}