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

4
我在项目中拥有一个功能完善的基于视图的NSOutlineView,并有适当设置的数据源。现在我想允许用户更改某些条目。因此,我在IB中使NSTextField可编辑。对于基于单元格的NSOutlineView,您可以使用委托方法outlineView:setObjectValue:forTableColumn:byItem:。然而,如NSOutlineViewData协议的头文件所述,这种方法不适用于基于视图的NSOutlineView

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

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

因此,我搜索了另一种委托方法,并找到了outlineView:shouldEditTableColumn:item:。但是该委托方法未触发。可能是因为我没有编辑单元格。

所以我的问题是:除了为每个NSTextField都进行委托之外,是否还有其他方法可以注意到行已更改?

2个回答

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;  
}

controlTextDidEndEditing函数不是NSTextFieldDelegate协议的一部分。这个代码可以正常工作,但我不知道为什么,也不知道如何自己找到这个问题。 - Wizard of Kneup
@WizardofKneup NSTextFieldDelegate协议继承自NSControlTextEditingDelegate协议,你可以在那里找到这些方法。 - Dalzhim

4
好的,看起来苹果希望我们使用每个 NSTextField 的委托方法,如此所述 这里:

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

因此,目前没有其他方法可行。


嘿@Paul Engstler,你有实现这个“target/action”方法的例子吗?我不确定这意味着什么,也不知道在哪里查找以正确地执行它。 - imns
答案在技术上是正确的,但下面Chris的回答展示了如何解决设置编辑值的根本问题。 - Wizard of Kneup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接