NSTextField在NSTableCellView内部时不调用委托

Dov*_*Dov 6 cocoa objective-c nsoutlineview nstextfield osx-lion

我在我的应用程序中有一个相当普通的源列表(从对象库中拖出),其中包含一个NSTreeController数据源.我将DataCellNSTextField内部设置为可编辑,但我希望能够为某些单元格关闭它.我认为你这样做的方式是使用委托,但没有我试过的委托方法被调用.有什么我想念的吗?我的委托在我的XIB中设置了一个插座,它恰好是所有者的委托,同时实现了和 协议.NSTextFieldNSOutlineViewNSOutlineViewDelegateNSTextFieldDelegate

此外,我也不能使用旧–outlineView:shouldEditTableColumn:item: NSOutlineViewDelegate方法,因为这只适用于基于单元格的大纲视图(我假设是这种情况 - 大纲视图文档似乎没有为Lion更新,尽管类似NSTableView文档有,并且这些方法也没有调用).

更新

我在一个全新的测试项目中重现了这一点,因此它绝对与我的任何自定义类无关.按照以下步骤创建我的示例项目,并重现此问题.

  1. 在Xcode 4.1中,创建一个类型为Mac OS X Cocoa Application的新项目,不选择任何特殊选项
  2. 使用下面指定的内容创建两个新文件SourceListDataSource.mSourceListDelegate.m
  3. 在MainMenu.xib中,将a Source List拖到窗口上
  4. 2级拖动Object小号到坞(窗口的左侧),指定SourceListDataSource为一个类,并且SourceListDelegate对于其他
  5. 将大纲视图dataSourcedelegate插座连接到这两个对象
  6. NSTextField在大纲视图的列中选择DataCell视图的静态文本
  7. 打开其Value绑定,保持默认设置
  8. 将其delegate插座连接到Source List Delegate对象
  9. 将其Behavior属性设置为可编辑
  10. 构建并运行,然后在大纲视图中的任一单元格上单击两次.

预期:该领域不可编辑,并且有一个"好吧,我应该吗?" 日志中的消息

实际:该字段是可编辑的,不记录任何消息

这是框架中的错误,还是我应该以不同的方式实现这一目标?


SourceListDataSource.m

#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)

SourceListDelegate.m

#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)

pau*_*kow 4

子类NSTableCellView,具有文本字段的出口,并在 中设置文本字段委托awakeFromNib。这样做之后,control:textShouldBeginEditing:就接到电话了。我不知道为什么,但是(编辑:)如果你在 xib 中设置委托,委托方法不会被称为\xe2\x80\x93 我和你有同样的经历。

\n\n

或者,您可以放弃委托,并使用绑定(到模型的布尔属性)有条件地设置“Editable”(可编辑),或者使用作用于模型实例并返回布尔值的值转换器。使用文本字段的可编辑绑定。

\n