我正在阅读一本关于OS X编程的书作为复习,并且有一个文档应用程序设置了一个数组控制器,tableView等。本章要求使用NSInvocation手动实现撤销支持。在本章中,他们要求添加一个创建员工方法并手动添加插件到NSArrayController,并将我的添加按钮连接到新方法而不是数组控制器。
相反,我用我的方法插入新对象:
-(void)insertObject:(Person *)object inEmployeesAtIndex:(NSUInteger)index {
NSUndoManager* undoManager = [self undoManager];
[[undoManager prepareWithInvocationTarget:self]removeObjectFromEmployeesAtIndex:index];
if (![undoManager isUndoing]) {
[undoManager setActionName:@"Add Person"];
}
[self startObservingPerson:object];
[[self employees]insertObject:object atIndex:index];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// Wait then start editing
[[self tableView]editColumn:0 row:index withEvent:nil select:YES];
});
}
这个工作正常(看起来有点傻),但我想知道这会产生什么问题。我已经在其他地方完成了这项工作,以便在动画完成后执行代码(无法找到更好的方法)。
提前致谢。
答案 0 :(得分:1)
为什么要推迟调用-editColumn:row:withEvent:select:
?
无论如何,风险在于这个-insertObject:...
方法结束和分派任务执行之间会有其他事情发生。也许某些内容会改变表格视图的内容,使index
不再引用刚刚添加的员工。