2009-12-11 60 views
0

我有一個自定義UITableViewCell子視圖上有一個按鈕,它有一個背景顏色代表優先級。用戶可以拖動表格中的單元格,這會更改該行表示的對象的優先級。我想更新他們完成時,按鈕的顏色,所以我實現了這一點:編輯UITableViewCells時被拖動

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
    //update data source 
    theCell.button.backgroundColor = newColor; 
} 

這,只要我讓了工作,只要的按鈕的背景顏色上的移動控制。但是,一旦細胞活動到位,背景顏色就會變回原來的顏色。單元格上的其他值可以正確更改(例如,如果我更改文本,它會保持更改)。

有什麼想法或解決方法?

+1

我認爲你需要分享更多的代碼。你的'willDisplayCell:'方法總是設置按鈕的背景顏色嗎?你是否重寫'setSelected:'或'setHighlighted:'或'prepareForReuse'? – benzado 2009-12-11 21:38:37

回答

1

據我所知,在任何動畫發生的時候,在行中改變任何東西都不明智。 (我試圖在谷歌找到這個,但沒有找到官方的參考)。

我身邊這讓做一樣的東西:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { 
    [tableView performSelector:@selector(updateRow) withObject:nil afterDelay:0.1f]; 
} 

- (void)updateRow { 
    theCell.button.backgroundColor = newColor; 
} 

我發現,這使得動畫完成,並沒有扔掉更改單元格。

+1

哦,你們這些負面評分員 - 你們能否發表評論,以便我們都能從你們的智慧中學習? – rein 2009-12-11 21:40:19

+0

我不得不使用0.5左右的延遲來確保它的工作,但至少它工作。 – 2009-12-15 21:36:32

0

在moveRowAtIndexPath退出後reloadData被調用嗎?

我的猜測是你依靠表格單元來存儲你的數據(即按鈕的背景顏色),但該信息應該最終存儲在你的數據模型中,並且由於單元格正在被重用,所以bg顏色不會不會堅持你期望的。當然,改變文本「堅持」的事實似乎與這個理論相矛盾。儘管如此,它確實感覺就像是沿着這些線(一組需要重新加載表數據並確保您的數據模型與給定索引處的表單元的請求同步的組合)。

+0

它存儲在數據模型中。如果我將細胞移出視野並返回,它會顯示正確的顏色。 – 2009-12-12 21:37:43

+0

另外,reloadData沒有被調用,沒有。在moveRowAtIndexPath之後沒有調用委託或數據源方法,UITableViewCell的setHighlighted和setSelected方法沒有被調用,我找不到在moveRowAtIndexPath之後被調用的任何方法。該單元格似乎在動畫完成後自行重置。 – 2009-12-12 21:42:15