我有一个基于视图的完美功能NSOutlineView
在我的项目中使用正确的设置数据源。现在我想允许用户更改某些条目。所以我做了NSTextField
在IB中可编辑。对于基于细胞的NSOutlineView
你可以使用委托方法outlineView:setObjectValue:forTableColumn:byItem:
但是它不适用于基于视图的NSOutlineView
如头文件中所述NSOutlineViewData
协议:
/* View Based OutlineView:此方法不适用。
*/
(void)outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item;
所以我搜索了另一个委托方法并发现outlineView:shouldEditTableColumn:item:
。但是这个委托方法不会被触发。可能是因为我没有编辑单元格。
所以我的问题是:除了为每一行分配一个委托之外,还有其他方法可以注意到行的更改吗?NSTextField
?
您的文本字段需要在 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)