2015-06-22 31 views
1

我有一個這樣的表視圖:如何在滾動tableview後點擊選擇行來修復崩潰?

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 

} 

每一件事工作正常,當我點擊一個行不滾動。我意識到當我運行代碼並立即滾動表並選擇一行時。我的程序將與錯誤崩潰: 「致命錯誤:意外發現零而展開的可選值」

錯誤顯示在這一行:

enter image description here

我不知道錯在這裏什麼?

+0

你在tableview中使用了多少段? –

+0

如果您打印lastIIndexPath,該怎麼辦 - 我認爲您選擇的內容已被重用 – timpone

+0

我的表格視圖中只有一個部分 –

回答

3

由於您使用可重複使用的電池,當您試圖選擇一個單元格,是不是在屏幕上了該應用程序會崩潰的細胞內存中沒有長期存在,試試這個:

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)時它不在屏幕上,則應在顯示前正確設置它。爲此,您需要更新表視圖的數據集以包含更改。

+0

現在我明白了爲什麼出現錯誤。 –

+0

@HieuDucPham很高興你明白這個問題,有時候可重複使用的單元格可以成爲絕招!祝你的程序完成! – Icaro

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") 
} 
+0

我試圖存儲整個indexPath,但仍然有錯誤。 –

+0

同樣的錯誤?或其他任何 –

+0

相同的錯誤。我也嘗試設置一個像這樣的lastSelectedIndexPath:「var lastSelectedIndexPath = NSIndexPath(forRow:0,inSection:0)」,因爲我只有一個部分。 –