Iphone 在拖动时编辑UITableViewCells

Iphone 在拖动时编辑UITableViewCells,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我有一个自定义的UITableViewCell子视图,上面有一个按钮,背景色表示优先级。允许用户在表中拖动单元格,这会更改该行表示的对象的优先级。我想在按钮完成后更新按钮的颜色,因此我实现了以下功能: - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { //update data

我有一个自定义的
UITableViewCell
子视图,上面有一个按钮,背景色表示优先级。允许用户在表中拖动单元格,这会更改该行表示的对象的优先级。我想在按钮完成后更新按钮的颜色,因此我实现了以下功能:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
    //update data source
    theCell.button.backgroundColor = newColor;
}
只要我一放开移动控制按钮,按钮的背景色就会改变,这一点就行了。但是,一旦单元设置动画,背景颜色将更改回其以前的颜色。单元格上的其他值已正确更改(例如,如果我更改了文本,它将保持更改)


有什么问题或解决方法吗?

据我所知,在任何动画发生时更改行中的任何内容都是不明智的。(我试着在谷歌上找到这个,但没有找到正式的参考资料)

我做了一些事情来解决这个问题,比如:

- (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;
}

我发现这允许动画完成,并且不会丢弃对单元格的更改。

在moveRowAtIndexPath退出后是否会调用重载数据


我的猜测是,您依赖tablecell来存储数据(即,按钮的背景色),但这些信息应该最终存储在您的数据模型中,而且由于单元格正在被重用,因此bg颜色不会与您期望的颜色一致。当然,改变文本“棍棒”的事实似乎与这一理论相矛盾。尽管如此,它确实感觉像是这样(需要重新加载表数据,并确保数据模型与给定索引XPath的表单元格请求同步)。

我认为您需要共享更多代码。您的
willDisplayCell:
方法是否始终设置按钮背景色?您是否覆盖了
setSelected:
setHighlighted:
prepareForReuse
?哦,您是否可以留下评论,以便我们都可以从您的智慧中学习?我必须使用大约0.5的延迟来确保它工作,但至少它工作。它存储在数据模型中。如果我将单元格移出视图并重新移入,它将显示正确的颜色。此外,不会调用reloadData,否。在moveRowAtIndexPath之后不会调用任何委托或数据源方法,UITableViewCell的setHighlighted和setSelected方法不会被调用,我找不到moveRowAtIndexPath之后调用的任何方法。动画完成后,单元似乎会自行重置。