0

这可能只是缺乏经验,NSOutlineView但我看不到这样做的方法。我有一个NSOutlineView(通过出色的PXSourceList实现)带有一个添加按钮,该按钮在我正确保存/写入/插入/删除行方面完全可用。我不使用 a 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以编辑它,它现在看起来像这样: 在此处输入图像描述

我的问题是:如何以编程方式第一次获得相同的状态(焦点、选定、突出显示),以使用户体验更好?

4

1 回答 1

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.

如果这没有帮助,那么您的代码中还有其他事情发生,上面的代码片段没有传达......

一般来说,我真的建议在学习一门新课程时,您可以通读文档页面,列出可用的方法(不推荐使用的方法除外),或者至少为您正在尝试的任务提供所有可用的方法去表演; 您将对课程的功能有更好的了解,并且不太可能使用不适当/低效/不优雅的方法。

于 2011-02-19T01:18:53.077 回答