2012-04-05 97 views
0

我有一個超過200多個單元的UITable。該表格與來自網絡的數據完美配合。現在我需要添加一種方法來更改標籤的背景顏色以與數據匹配(如果值減少,則爲紅色,如果值增加,則爲綠色)。這似乎最初運作良好,但一段時間後,即使值更新正常,顏色也會變爲靜態。下面是我的代碼的例子是在layoutSubviews方法:UITableViewCells中的顏色不會改變

更新

我已經更新的代碼,以顯示我的我的表。請注意,數據被完全分配給單元格。不管價值是多少,幾分鐘後拒絕改變的是單元格的顏色。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     UILabel* label = [[UILabel alloc] initWithFrame:self.contentView.bounds]; 
     label.tag = 1; 
     [cell.contentView addSubview:label]; 
     [label release]; 
    } 
    UILabel *label = (UILabel*)[cell viewForTag:1]; 
    float value = [label.text floatValue]; 
    float newValue = [dataSource objectAtIndex:indexPath.row]; 

    // Get the current value of the cell and compare it with the new value 
    if(value < newVal) 
    { 
     label.backgroundColor = [UIColor greenColor]; 
    } 
    else if(value > newVal) 
    { 
     label.backgroundColor = [UIColor redColor]; 
    } 
    label.text = [NSString stringWithFormat:@"%d", newValue]; 
} 
+0

爲什麼此代碼在layoutSubviews中?這不會每次都被調用。它應該在cellForRowAtIndexPath中。 – jrturton 2012-04-05 19:32:32

+0

在閱讀下面的答案之後,我將代碼移到了適當的位置。感謝您的注意。 – Seb 2012-04-05 19:52:39

回答

0

您從數據源的值與先前在單元格中顯示的值。

這不會是一個有效的比較。你將會有8或10個你的單元的實例,它們被出列並重用。因此,您將比較單元格60的數據源與此單元格中使用的最後一個值(可能來自第45行)。這是沒有意義的。

您需要將舊值存儲在數據源中的某處,然後對其進行比較。

+0

會創建一個字典並存儲行索引和舊值的工作?這樣,當我再次進行比較時,我可以根據需要它的行從字典中提取舊值? – Seb 2012-04-05 21:23:54

+0

是的,或者你的數據源可以是一個字典數組,每個字典都有兩個鍵,新舊值。 – jrturton 2012-04-05 21:32:35

+0

這似乎做到了。感謝您的幫助,並深入瞭解UITableViewCell。我明白細胞被重複使用,我不明白的是爲什麼看到的細胞會被重複使用。 – Seb 2012-04-05 22:36:05

0

設置單元格的背景顏色將不起作用,因爲有另一個視圖,它的contentView坐在上面。由於iOS像畫家的畫布一樣處理繪畫,因此contentView會阻礙您對單元格背景所做的任何更改。但是,您可以在contentView上設置背景顏色(畢竟它是UIView),並且您應該看到您的綠色和紅色。

+0

雖然我能看到顏色,但我得到的問題與最初提到的相同。一段時間後,顏色似乎不再更新。我試着滾動看看是否會有所幫助,但無論設置的值是多少,相同的單元格總是會設置爲相同的顏色。 – Seb 2012-04-05 20:04:02

0

嗯,這可能是因爲deQueue,你可以嘗試的是在向你的單元添加新的子視圖之前運行一個循環並從中刪除所有的子視圖。確保在檢查空單元格的條件之後執行此操作。

for(UIView *subview in cell.subviews){ 
    [subview removeFromSuperview]; 
} 

可能有助於