滚动表格视图后点击选择行时如何修复崩溃?

Posted

技术标签:

【中文标题】滚动表格视图后点击选择行时如何修复崩溃?【英文标题】:How can I fix crash when tap to select row after scrolling the tableview? 【发布时间】:2015-06-22 05:03:34 【问题描述】:

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

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

这一行的错误显示:

不知道这里出了什么问题?

【问题讨论】:

你在tableview中使用了多少Section? 如果你 println lastIIndexPath - 我认为你选择的东西已经被重用了 我的 Tableview 中只有一个部分 【参考方案1】:

由于您使用的是可重复使用的单元格,当您尝试选择不再出现在屏幕中的单元格时,应用程序将崩溃,因为该单元格不再存在于内存中,请尝试以下操作:

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),您应该在显示之前正确设置它。为此,您需要更新表视图的数据集以包含更改。

【讨论】:

@HieuDucPham 很高兴您了解问题所在,有时可重复使用的单元格可能是个骗局!祝你的应用顺利完成!【参考方案2】:

更好的方法是存储整个 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")

【讨论】:

我尝试存储整个 indexPath 但仍然出现错误。 同样的错误。我也尝试像这样设置 lastSelectedIndexPath:“ var lastSelectedIndexPath = NSIndexPath(forRow: 0, inSection: 0)” 因为我只有一个部分。 同样的问题,虽然尝试了你的两个代码。正如我刚刚从上面的 Icaro 那里学到的,问题是我正在设置已重用的单元格,因此我在数据出现之前设置了数据。所以我遇到了问题。

以上是关于滚动表格视图后点击选择行时如何修复崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

搜索控制器活动时选择表格行时应用程序崩溃

EXCEL打开是一片空白,要从开始选择文件才能打开表格,请问大神们如何修复才能直接打开表格呢?

如何修复滚动视图 android 底部的按钮?

如何修复 ForEach 循环中不可点击的按钮?

我的Excel表格打开就乱码了,请问该怎么修复

EXCEL文件打开乱码,xls格式的,如何修复?