2017-01-27 58 views
0

我打電話給一個JSON並將數據保存在一個數組上,然後重新加載tableView,當我使用dequeueReusableCell一切正常時,但是當我更改爲cellForRow我每次遇到崩潰時都會崩潰細胞。究其原因即時通訊使用cellForRow是我需要的用戶點擊它後更改單元格的形象,但如果我使用dequeueReusableCell我得到多種變化(因爲細胞總是重複使用)。cellForRow返回nil - swift 3

我在let cell = tableView.cellForRow(at: indexPath) as! TicketTableViewCell得到一個崩潰。我已經做了搜索,但沒有任何幫助。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.cellForRow(at: indexPath) as! TicketTableViewCell 

    //let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TicketTableViewCell 

    cell.date.text = arrDate[indexPath.row].date 

    //Top Bottom Space. 
    let maskLayer = CAShapeLayer() 
    let bounds = cell.bounds 
    maskLayer.path = UIBezierPath(roundedRect: CGRect(x: 2, y: 2, width: bounds.width-4, height: bounds.height-4), cornerRadius: 2).cgPath 
    cell.layer.mask = maskLayer 

    return cell 
} 
+2

這顯然是給你爲零,因爲細胞從來沒有在'indexPath'加入,您需要使用'dequeueReusableCell'和添加在你的問題重複使用的問題。 –

+0

您應該在'cellForRowAt'中使用'dequeueReusableCell',並在其他地方使用'cellForRow'。 – kennytm

回答

1

從數據源方法中tableView(:cellForRowAt:)因爲第二個方法只是給你回,你以前給它的第一種方法的細胞則不能使用tableView.cellForRow(at: indexPath)

它的意思,如果你有一個索引路徑取回從表視圖中的單元格。你無法繞過表視圖的視圖 - 重用,你必須使用出列。

如果問題是你「獲得多個變化(因爲細胞總是重複使用)」你需要保證細胞正常重用準備,和/或它只是設置一次。

我不確定你的實現是什麼,但是當你的視圖控制器被調用時,用戶點擊了單元格(從按鈕或手勢識別器),你應該傳遞單元本身,因爲如果你有單元格你可以調用tableview.indexPathForCell()並知道哪個indexPath被點擊,所以你會知道什麼數據來更新這個單元格。希望這可以幫助。

編輯:(單元格是'選擇'的意義上,你跟蹤,而不是單元格的selected屬性,如果你想使用,它是所有不同的)。您還應跟蹤當前選定的索引並在數據源方法中以不同方式格式化單元格,以防用戶將所選單元格滾動到屏幕外並返回時應仍選中。

具有數據源的方法檢查是否選擇一個單元格,因爲它也會讓你只是胡亂重新加載,你認爲可能有變化的任何細胞是很重要的。但是這不是很好的做法(但簡單而美好!)更好的是,如果你有單元,你可以直接設置它的屬性。

+0

問題是我不能更改最後一個單元格圖像。讓我們假設用戶單擊單元格A(圖像更改),然後單擊單元格B,單元格A應該獲取默認圖像,因爲它不再選擇。每當用戶單擊一個單元格時,我將indexPath保存在一個變量上,當他單擊另一個單元格時,我只是使用該變量將單元格上的圖像設置爲原始狀態,但這不起作用。 – Adrian

+0

你所描述的應該與此兼容。你所描述的聽起來很好,我需要看代碼。如果你想把所有其他的單元格返回到默認值,一種常用的方法是循環遍歷可見單元格,比如'tableView.visibleCells {'中的單元格,並將所有內容設置爲默認值,然後設置你想要的不同值。然後,您不需要跟蹤之前選擇了哪個單元格。 –

+1

確定 - 那麼您只需重新載入上一行,並重新繪製它,確認selectedIndex不同,並使用默認圖像。 或者它會,一旦你添加一些代碼到'cellForRowAt'來更新單元格。如果直接將圖像作爲didSelect方法的一部分進行更新,那麼您應該將其更新,更新您的selectedIndex,然後重新加載當前和之前(存在的位置) – Russell

2

回去使用dequeueReusableCell

didSelectRowAt變化,你要使用的圖像,或在您的數據集中的地方設置一個值,並刷新該行

確保cellForRowAt方法使用已設置的更新圖像或標誌,並重新繪製單元格。

+0

其實我這樣做,但問題是,我不能改變最後的細胞圖像。讓我們假設用戶單擊單元格A(圖像更改),然後單擊單元格B,單元格A應該獲取默認圖像,因爲它不再選擇。每當用戶單擊一個單元格時,我將indexPath保存在一個變量上,當他單擊另一個單元格時,我只是使用該變量將單元格上的圖像設置爲原始狀態,但這不起作用。 – Adrian