我的项目中有一个完美的基于视图的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
的代理时,是否还有其他方式可以注意到?
答案 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}}的委托方法:
此方法适用于基于单元格的表视图,不能与基于视图的表视图一起使用。相反,目标/操作用于视图单元格中的每个项目。
所以目前没有其他方法可以做到这一点。