如何在滚动tableview后点击选择行时修复崩溃?

时间:2015-06-22 05:03:35

标签: ios xcode swift uitableview tableviewcell

我有一个像这样的表格视图:

enter image description here

当用户点击一行时,我想取消选中最后一行并检查所选行。所以我写了这样的代码: (例如我的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

错误显示在这一行:

enter image description here

我不知道这里有什么问题?

2 个答案:

答案 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")
}