在基于视图的NSOutlineView中为NSTextField委派事件?

时间:2011-12-30 11:49:40

标签: objective-c delegates nsoutlineview

我的项目中有一个完美的基于视图的NSOutlineView功能正常的设置数据源。现在我想允许用户更改某些条目。所以我让IB中的NSTextField可编辑。对于基于单元格的NSOutlineView,您可以使用委托方法outlineView:setObjectValue:forTableColumn:byItem:,但它不适用于NSOutlineView协议的头文件中所述的基于视图的NSOutlineViewData

  

/ *基于视图的OutlineView:此方法不适用。    * /

     

(void)outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item;

所以我搜索了另一个委托方法并找到了outlineView:shouldEditTableColumn:item:。但是这个委托方法不会被触发。可能是因为我没有编辑一个单元格。

所以我的问题是:当行更改而不是每个NSTextField的代理时,是否还有其他方式可以注意到?

2 个答案:

答案 0 :(得分:9)

您是正确的,您的文本字段需要在Interface Builder中可编辑。

接下来,让您的控制器符合NSTextFieldDelegate。然后,在outlineView:viewForTableColumn:item:中设置文本字段的委托,如下所示:

tableCellView.textField.delegate = self

这是一个简化示例,您已经实现了返回大纲视图项目的表格单元格视图的方法。

-(NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
{
    NSTableCellView *tableCellView = [outlineView makeViewWithIdentifier:@"myTableCellView" owner:self];

    MyItem *myItem = (MyItem *)item; // MyItem is just a pretend custom model object 
    tableCellView.delegate = self;
    tableCellView.textField.stringValue = [myItem title];

    tableCellView.textField.delegate = self;

    return result;
}

然后,控制器应该获得controlTextDidEndEditing通知:

- (void)controlTextDidEndEditing:(NSNotification *)obj
{
    NSTextField *textField = [obj object];
    NSString *newTitle = [textField stringValue];

    NSUInteger row = [self.sidebarOutlineView rowForView:textField];

    MyItem *myItem = [self.sidebarOutlineView itemAtRow:row];
    myItem.name = newTitle;  
}

答案 1 :(得分:4)

好吧,Apple似乎希望我们使用NSTextField所述{{1}}的委托方法:

  

此方法适用于基于单元格的表视图,不能与基于视图的表视图一起使用。相反,目标/操作用于视图单元格中的每个项目。

所以目前没有其他方法可以做到这一点。