Dov*_*Dov 6 cocoa objective-c nsoutlineview nstextfield osx-lion
我在我的应用程序中有一个相当普通的源列表(从对象库中拖出),其中包含一个NSTreeController数据源.我将DataCellNSTextField内部设置为可编辑,但我希望能够为某些单元格关闭它.我认为你这样做的方式是使用委托,但没有我试过的委托方法被调用.有什么我想念的吗?我的委托在我的XIB中设置了一个插座,它恰好是所有者的委托,同时实现了和 协议.NSTextFieldNSOutlineViewNSOutlineViewDelegateNSTextFieldDelegate
此外,我也不能使用旧–outlineView:shouldEditTableColumn:item: NSOutlineViewDelegate方法,因为这只适用于基于单元格的大纲视图(我假设是这种情况 - 大纲视图文档似乎没有为Lion更新,尽管类似NSTableView文档有,并且这些方法也没有调用).
我在一个全新的测试项目中重现了这一点,因此它绝对与我的任何自定义类无关.按照以下步骤创建我的示例项目,并重现此问题.
Source List拖到窗口上Object小号到坞(窗口的左侧),指定SourceListDataSource为一个类,并且SourceListDelegate对于其他dataSource和delegate插座连接到这两个对象NSTextField在大纲视图的列中选择DataCell视图的静态文本Value绑定,保持默认设置delegate插座连接到Source List Delegate对象Behavior属性设置为可编辑预期:该领域不可编辑,并且有一个"好吧,我应该吗?" 日志中的消息
实际:该字段是可编辑的,不记录任何消息
这是框架中的错误,还是我应该以不同的方式实现这一目标?
#import <Cocoa/Cocoa.h>
@interface SourceListDataSource : NSObject <NSOutlineViewDataSource>
@property (retain) NSArray *items;
@end
@implementation SourceListDataSource
@synthesize items;
- (id)init
{
self = [super init];
if (self) {
items = [[NSArray arrayWithObjects:@"Alo", @"Homora", nil] retain];
}
return self;
}
- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {
if (!item) {
return [self.items objectAtIndex:index];
}
return nil;
}
- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {
return !item ? self.items.count : 0;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item {
return NO;
}
- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
return item;
}
@end
Run Code Online (Sandbox Code Playgroud)
#import <Foundation/Foundation.h>
@interface SourceListDelegate : NSObject <NSOutlineViewDelegate, NSTextFieldDelegate> @end
@implementation SourceListDelegate
- (NSTableRowView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
return [outlineView makeViewWithIdentifier:@"DataCell" owner:self];
}
- (BOOL)control:(NSControl *)control textShouldBeginEditing:(NSText *)fieldEditor {
NSLog(@"well, should I?");
return NO;
}
@end
Run Code Online (Sandbox Code Playgroud)
子类NSTableCellView,具有文本字段的出口,并在 中设置文本字段委托awakeFromNib。这样做之后,control:textShouldBeginEditing:就接到电话了。我不知道为什么,但是(编辑:)如果你在 xib 中设置委托,委托方法不会被称为\xe2\x80\x93 我和你有同样的经历。
或者,您可以放弃委托,并使用绑定(到模型的布尔属性)有条件地设置“Editable”(可编辑),或者使用作用于模型实例并返回布尔值的值转换器。使用文本字段的可编辑绑定。
\n