滚动表格视图后点击选择行时如何修复崩溃?
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 那里学到的,问题是我正在设置已重用的单元格,因此我在数据出现之前设置了数据。所以我遇到了问题。以上是关于滚动表格视图后点击选择行时如何修复崩溃?的主要内容,如果未能解决你的问题,请参考以下文章