2011-10-22 69 views
8

iOS 5最后添加了一个moveRowAtIndexPath:toIndexPath:方法到UITableView。问题是,调用它只会移动行,它不会更新/重绘它。唯一的方法似乎是直接找到单元并调用setNeedsDisplay。但是这很棘手,因为你永远不知道单元格是否已经移动。moveRowAtIndexPath不刷新单元格的内容

我也不能拨打reloadRowsAtIndexPaths:,因为我不允许在同一个beginUpdates-endUpdates区块内的单个行上应用2个动画。

我可以想到的解决方法有很多,例如将整个事件分成2个动画块。但我想知道我是否错过了一些东西,因为整个行为对我来说似乎很古怪。

+0

不确定,但请尝试查看'beginUpdates'和'endUpdates'。您可能能够跟踪正在移动的indexPath,并在“endUpdates”中将其更改为适当的单元格(如果已移动)。 – runmad

+0

在endUpdates取消该单元格的待定动画之后调用任何新行动画函数。换句话说,单元格会重绘,但移动动画不会再发生。调用'setNeedsDisplay'也有类似的效果。 – samvermette

+0

提交错误报告:http://openradar.appspot.com/10457435 – samvermette

回答

14

最后收到正式答复苹果就这个问题:

工程已确定以下信息基于 按预期这个问题表现:

只有插入和更新导致细胞是请求从数据 源(第一个,因为它是新的,第二个,因为你已经明确告诉表视图更新单元格 )。删除并移动 不会更新内容,因为在执行的动作 中并不隐含。如果您需要在更新过程中更改单元格 的内容,只需进入单元格并更改内容即可。

2

他们喜欢难以让我们不要他们;-)

case NSFetchedResultsChangeUpdate: 
     [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
     break; 

    case NSFetchedResultsChangeMove: 
     // old API 
     //[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     //[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 

     // new API 
     [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:newIndexPath]; // note use of newIndexPath 
     [tableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath]; // NS_AVAILABLE_IOS(5_0); 
     break; 

注意在ChangeMove,configureCell具有相比,其在ChangeUpdate使用所以,如果复制粘贴仔细不同PARAMS。相当棘手的做对了。