【发布时间】:2011-08-19 12:10:48
【问题描述】:
我的应用程序中有一个相当普通的源列表(从对象库中拖出),其数据源为 NSTreeController。我将 DataCell 内的NSTextField 设置为可编辑,但我希望能够为某些单元格关闭它。我认为你会这样做的方式是使用NSTextField 的委托,但我尝试过的委托方法都没有被调用。有什么我想念的吗?我在我的 XIB 中设置了一个带有插座的委托,它恰好是所有者 NSOutlineView 的委托,同时实现了 NSOutlineViewDelegate 和 NSTextFieldDelegate 协议。
另外,我也不能使用旧的 –outlineView:shouldEditTableColumn:item: NSOutlineViewDelegate 方法,因为它只适用于基于单元格的大纲视图(我假设是这种情况 - 大纲视图文档没有'虽然类似的 NSTableView 文档已经为 Lion 更新了 t,但这些方法也没有被调用)。
更新
我在一个全新的测试项目中复制了它,所以它绝对与我的任何自定义类无关。按照以下步骤创建我的示例项目,并重现此问题。
- 在 Xcode 4.1 中,创建一个新项目,类型为 Mac OS X Cocoa Application,不选择任何特殊选项
- 创建两个新文件,SourceListDataSource.m 和 SourceListDelegate.m,其内容如下所示
- 在 MainMenu.xib 中,将
Source List拖到窗口上 - 将两个
Objects 拖到 Dock 上(窗口左侧),为一个指定SourceListDataSource类,为另一个指定SourceListDelegate - 将大纲视图的
dataSource和delegate出口连接到这两个对象 - 为大纲视图列内的 DataCell 视图选择静态文本
NSTextField - 打开其
Value绑定,保持默认设置 - 将其
delegate出口连接到 Source List Delegate 对象 - 将其
Behavior属性设置为可编辑 - 构建并运行,然后在大纲视图中的任一单元格上单击两次。
预期:该字段不可编辑,并且有一个“好吧,我应该吗?”日志中的消息
实际:该字段是可编辑的,并且不记录任何消息
这是框架中的错误,还是我应该以不同的方式实现这一点?
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
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
【问题讨论】:
标签: objective-c cocoa osx-lion nstextfield nsoutlineview