2014-07-07 48 views
0

在我被釘在十字架上之前,讓我說明......是的,我已閱讀關於此主題的每個「相關」答案,但尚未找到可行的解決方案。大多數「正確的」答案都是在ARC之前,並討論「釋放」一個細胞,而這個細胞已經不再存在了。其次,我的問題不是「全球性的」,這意味着一些觀點沒有問題,而其他觀點是有問題的。所以這裏是我的問題...如何解決uitableviewcell重用的自定義子類的問題?

我有分類的uitableviewcell和安裝一些uilabels &自定義uiviews。從那裏我連接了所有的ib(Xcode 5.x iOS 7.x)。一旦我輸入適當的代碼並從nsarray「不可變」創建表格視圖&動態單元格,所有操作都完全按預期完成,沒有問題。

這是有趣的部分。我正在進行更改,以允許tableview的數據源,這是一個nsarray是可變的,以允許添加和刪除項目/單元格。這是事情變得毛茸茸的地方。當我開始向數組添加更多對象時,以及當重用單元格放在屏幕上時,來自舊單元格的可視數據正在新單元格上重用。我說「可視化」,因爲一旦選擇了單元格,視圖更新以顯示正確的信息。有趣的部分是,正如我所說我有一些uilabels從來沒有任何問題被重新顯示,然而我的自定義視圖現在是顯示過去單元格信息的難題,當向後滾動時,原始單元格不再顯示正確的信息。一旦單元被輕敲,那麼單元更新並顯示正確的信息。

這是最令人困惑的一點是,在我的數組是可變的,並有一個靜態數量的對象,這工作得很好。即使一個細胞脫離屏幕返回,它仍然是正在顯示的正確信息。現在我知道不應該與它有任何關係,但奇怪的是,它使用我現在使用的同樣的tableview &單元代碼。

我已經嘗試添加在

MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

if (!cell) { 
    cell = [[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; // note: obviously as stated, tacking on "autorelease" here as mention in other suggestions is not going to work. 
} 

這並不解決問題。

我試着重寫我的自定義單元格子類上的「prepareForReuse」方法,但這也不能解決問題。我已經提出了意見,「強」&「弱」,和所有這些,仍然每三分之一左右的單元格重複垃圾數據,直到它刷新。再次,與視圖設置相同方式的uilabels沒有問題,數據也不會被重複使用。我會說我的自定義視圖存在問題,但是從靜態的相同信息來源設置表是沒有問題的。

我想發佈一些代碼,但它是代表的所有非常通用的代碼&代表。任何建議將不勝感激。

正如我所說的代碼都是很普通的,但顯然它需要冒充反正所以這裏是..

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    MyThing *thing = self.stuffArray[indexPath.row]; 

    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

    cell.thisLabel.text = thing.someText; 
    cell.thatLabel.text = thing.otherText; 

    cell.view1.someProptery = thing.object1.property 
    cell.view2.someProptery = thing.object2.property 
    cell.view3.someProptery = thing.object3.property 
    //"someProperty" on "view..." is an NSInt that is used to determine custom drawing in the view. 

    return cell; 
} 
+2

首先,您將您的問題隱藏在比中國牆更大的文字牆中。更清楚問題是什麼。其次,你的UILabel顯示錯誤信息的問題在你的'cellForRow'或'willDisplayCell'方法中。重複使用Cell會重新使用滾動時彈出的單元格。這意味着當它們再次使用時,它仍然具有所有的信息。因此,您需要確保在設置單元格屬性時重置每個可能的UILabel。 – LyricalPanda

+1

提供完整的'tableView:cellForRowAtIndexPath:'方法。 – Dima

+0

@LyricalPanda如果你會打擾你閱讀你的問題,1)意識到冗長的解釋的原因,2)明白我沒有任何UILabels的問題。請閱讀這個問題,然後發佈一些建設性的東西。 – DoS

回答

1

我認爲關鍵的解決之道在於你對在自定義視圖評論細胞。如果cellForRowAtIndexPath正在改變這些視圖的狀態,他們需要知道它們必須重繪,所以你需要在你的自定義view.m中增加具有一些屬性的合成設置器。

如果someProperty決定如何繪製這個視圖,那麼它有責任指示視圖已過時....

- (void)setSomeProperty:(NSInteger)someInt { 
    _someProperty = someInt; 
    [self setNeedsDisplay]; 
} 
+0

,所以我繼續添加了一個調用setNeedsDisplay的單元重用方法,該方法工作正常。我會嘗試將其添加到設置方法中,看看它是如何工作的。 – DoS

+0

有道理,它的工作原理。我認爲setNeedsDisplay在這裏做得更好。這樣,無論上下文對someProperty發生何種變化(例如,與表格單元格不同的超級視圖),視圖的行爲都會正確。 (並且你不需要用這個視圖的私有工作來隱藏你的表視圖代碼)。 – danh

+0

絕對,並像冠軍一樣工作。非常棒,現在我可以從其他更新方法中取出其他setNeedsDisplay調用。 – DoS

相關問題