我正在尝试非常接近地模仿 iPhone 手机应用程序最近调用 TableView 的功能,在 OS X 上使用 NSTableView。所需的功能是您单击一个按钮,TableView 从显示所有最近调用切换到显示子集在那些错过的电话中,我想要你在 iPhone 上看到的动画,其中行的出现和消失是动画的。
我正在使用基于视图的 NSTableView,我将它与手动数据源和委托非常简单地连接到我的视图控制器中(不使用可可绑定)。
除了尝试删除行以显示“错过”呼叫的子集时,一切正常。如果我只是重建作为 TableView 数据源的 NSMutableArray,然后调用 reloadData,它就可以完美运行。但这没有给我任何动画。这是导致 TableView 和数据源 NSMutableArray 完美同步的非动画版本,TableView 中的内容正确,但没有动画:
- (IBAction)showMissed:(id)sender {
NSMutableIndexSet *indices = [NSMutableIndexSet indexSet];
Call *call;
for (call in callsArray) {
if (!call.missed) {
[indices addIndex:[callsArray indexOfObject:call]];
}
}
if ([indices count] > 0) {
[callsArray removeObjectsAtIndexes:indices];
[self.recentsTableView reloadData];
}
}
当我尝试使用 NSTableViewremoveRowsAtIndexes:indices withAnimation:
方法来获取我想要的动画时,我得到了一些非常奇怪的行为。这是动画的 showMissed 方法:
- (IBAction)showMissed:(id)sender {
NSMutableIndexSet *indices = [NSMutableIndexSet indexSet];
Call *call;
for (call in callsArray) {
if (!call.missed) {
[indices addIndex:[callsArray indexOfObject:call]];
}
}
if ([indices count] > 0) {
[callsArray removeObjectsAtIndexes:indices];
[self.recentsTableView removeRowsAtIndexes:indices withAnimation:NSTableViewAnimationSlideUp];
}
}
我在该方法的动画版本中使用的逻辑是从 Apple 的TableViewPlaygound示例代码中提取的。
当我运行这段代码时,我得到了两个奇怪的结果。首先,TableView 不仅仅显示“错过”的调用——它显示了正确的行数(即 TableView 中的行数等于标记为错过的调用对象的数量),但行中显示的实际对象是有些错过了,有些没有错过。
更奇怪的是,在动画版本运行后,callsArray 中包含所有 Call 对象,就好像该[callsArray removeObjectsAtIndexes:indices];
语句根本不存在一样。似乎该方法以某种removeRowsAtIndexes:indices withAnimation:
方式弄乱了我的数据源数组的内容并将整个事情搞砸了。
FWIW,我的动画 showAll 方法基本上与上述方法相反,使用insertRowsAtIndexes:indices withAnimation:
似乎工作得很好。
我究竟做错了什么?