我正在阅读一本关于 OS X 编程的书作为复习,并使用数组 Controller 、tableView 等设置了一个文档应用程序。本章要求使用 NSInitation 手动实现撤消支持。在本章中,他们要求手动添加创建员工方法,将导出添加到 NSArrayController,并将我的添加按钮连接到新方法而不是数组 Controller 。
相反,我用插入新对象的方法来做到这一点:
-(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];
});
}
这工作正常(看起来有点傻),但我想知道这可能会引起什么问题。我在其他地方这样做是为了在动画完成后执行代码(无法找出更好的方法)。
提前致谢。
最佳答案
为什么要延迟调用 -editColumn:row:withEvent:select:
?
无论如何,风险在于在此 -insertObject:...
方法结束和分派(dispatch)任务执行之间会执行其他操作。也许会更改 TableView 的内容,使 index
不再引用刚刚添加的员工。
关于macos - 在此用例中使用 GCDdispatchAfter() 时可能会出现哪些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23728655/