【问题标题】:How to edit NSOutlineView item如何编辑 NSOutlineView 项目
【发布时间】:2013-10-05 16:50:40
【问题描述】:

我有一个使用 NSTreeController 的 Outlineview,在大多数情况下,一切都按照我的意愿运行,除了添加新项目时,我希望自动选择项目进行编辑。过去在使用 NSTableview 时,我会确定项目所在的行并使用该函数

- (void)editColumn:(NSInteger)columnIndex row:(NSInteger)rowIndex withEvent:(NSEvent *)theEvent select:(BOOL)flag

但是,由于 NSOutlineView 使用 NSindexPath,我正在为如何完成而苦苦挣扎 这个,那么是否有一个函数可以传递一个 NSIndexpath 而不是一行来实现相同的结果。或者我应该对 NSOutlineView 有不同的方法。

【问题讨论】:

  • 您是否在界面生成器中将列设置为可编辑??
  • 是的,我可以双击并编辑任何项目,这不是问题。我需要的是一种以编程方式启动它的方法。
  • 您是否尝试过这种方法(即editColumn:row:withEvent:select:),因为过去的经验似乎对我有用。
  • NSOutlineView 不使用 NSIndexPaths。它使用项目,这些项目应该是模型对象。项目应该是 NSTreeController 直接和间接管理的内容对象。

标签: cocoa cocoa-bindings nsoutlineview nstreecontroller


【解决方案1】:

您应该可以在 NSOutlineView 上调用 editColumn:row:withEvent:select:

[outlineView editColumn:0 row:editRowIndex withEvent:nil select:YES];

虽然这是来自NSTableView 的方法,但NSOutlineViewNSTableView 的子类,因此您也可以在大纲视图中调用它。

【讨论】:

  • 您可以使用rowForItem:获取行索引。
  • @PeterHosey 我添加了一个答案,它确实给出了预期的结果。但仍然想知道这是否是最好的方法。
【解决方案2】:

原来我的问题与 addChild 方法有关,addChild 的文档说明如下;

特殊注意事项

从 OS X v10.4 开始,此方法的结果被延迟 直到运行循环的下一次迭代,以便错误 演示机制可以以表格形式提供反馈。

所以,我添加了以下内容,并带有相应的选择器

[self performSelector:@selector(editNewSector:) withObject:nil afterDelay:0];

现在似乎一切正常,我的代码在下面

- (IBAction)addChildSector:(id)sender
{
    [[self myTreeController] addChild:sender];
    [self performSelector:@selector(editNewSector:) withObject:nil afterDelay:0];
}

- (IBAction)editNewSector:(id)sender
{
    NSTreeNode *nodeSector = [[self myOutlineView]
                                   itemAtRow:[[self myOutlineView] selectedRow]];

    NSInteger row = [[self myOutlineView] rowForItem:nodeSector];
    [[self myOutlineView] editColumn:0 row:row withEvent:nil select:YES];
}

【讨论】:

  • 如果树控制器的selectsInsertedObjectsNO,这可能会失败。不过,我不知道有更好的方法来获取新添加的项目。
  • 我做到了。它工作正常,但我需要如何设置默认名称,如“无标题文件夹”。你能帮我吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 2022-11-14
  • 2013-06-15
相关资源
最近更新 更多