2009-12-11 62 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