这可能只是缺乏NSOutlineView
的经验,但我看不到这样做的方法。我有一个NSOutlineView
(用优秀的PXSourceList实现),带有一个添加按钮,在我正确保存/写入/插入/删除行的方面完全正常。我不使用NSTreeController
,我也不使用绑定。我使用以下代码添加实体:
- (void)addEntity:(NSNotification *)notification {
// Create the core data representation, and add it as a child to the parent node
UABaseNode *node = [[UAModelController defaultModelController] createBaseNode];
[sourceList reloadData];
for (int i = 0; i < [sourceList numberOfRows]; i++) {
if (node == [sourceList itemAtRow:i]) {
[sourceList selectRowIndexes:[NSIndexSet indexSetWithIndex:i] byExtendingSelection:NO];
[sourceList editColumn:0 row:i withEvent:nil select:NO];
break;
}
}
}
按下添加按钮时,会插入一个新行:
如果我点击了,然后选择该行并按enter
进行编辑,它现在看起来像这样:
我的问题是:我怎样才能以编程方式第一次获得相同的状态(焦点,选中,突出显示),以改善用户体验?
答案 0 :(得分:1)
这样的事情对我有用:
- (void)addEntity:(NSNotification *)notification {
// Create the core data representation, and add it as a child to the parent node
UABaseNode *node = [[UAModelController defaultModelController] createBaseNode];
[sourceList noteNumberOfRowsChanged];
NSInteger row = [sourceList rowForItem:node];
[sourceList scrollRowToVisible:row];
[sourceList selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
[sourceList editColumn:0 row:row withEvent:nil select:YES];
}
您可以使用rowForItem:
代替重复检查itemAtRow:
。
您通常还希望使用[sourceList scrollRowToVisible:...]
以防新行显示,并且您可以使用noteNumberOfRowsChanged
代替reloadData
,除非数据实际已更改。
标准的Mac行为是选择新创建的项目的内容,因此请使用select:YES
。
如果这没有帮助,您的代码中还会发生其他内容,而上述代码段无法通信......
一般来说,我真的建议你在学习一个新课程的时候,你会在文档页面中一直列出可用的方法(除了不推荐使用的方法),或者至少可以用于任务的所有方法'试图表演;你会更好地了解班级的能力,不太可能使用不恰当/低效/不优雅的方法。