У меня есть довольно простой исходный список (вытащенный из библиотеки объектов) в моем приложении с NSTreeController
в качестве его источник данных. Я установил NSTextField
внутри DataCell для редактирования, но я хочу иметь возможность отключить это для некоторых ячеек. Я предполагал, что вы сделаете это с помощью делегата для NSTextField
, но ни один из методов делегата, которые я пробовал, не вызывается. Что-то мне не хватает? У меня есть делегат, установленный с выходом в моем XIB, и он также является делегатом владельца NSOutlineView
, реализующего как NSOutlineViewDelegate
, так и NSTextFieldDelegate
].
Кроме того, я не могу использовать старый метод –outlineView: shouldEditTableColumn: item:
NSOutlineViewDelegate
, так как он работает только с представлениями структуры на основе ячеек ( I Предполагаю, что это так - документация Outline View, похоже, не была обновлена для Lion, хотя аналогичная документация NSTableView
есть, и эти методы также не вызываются ).
Я воспроизвел это в новом тестовом проекте, поэтому оно определенно не связано ни с одним из моих пользовательских классов. Выполните следующие шаги, чтобы создать мой пример проекта и воспроизвести эту проблему.
Source List
в окно Object
на доке (левая часть окна), указав класс SourceListDataSource
для одного и SourceListDelegate
для другого dataSource
и делегируют
выходы этим двум объектам NSTextField
для представления DataCell внутри столбца представления структуры Значение
привязка с сохранением настроек по умолчанию делегата
o utlet к объекту делегата списка источников Behavior
значение Editable Expected : Поле не редактируется, и есть "ну а я должен?" сообщение в журнале
Фактическое : поле доступно для редактирования, сообщения не регистрируются
Это ошибка в структуре, или я должен добиться этого другим способом?
#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
#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