В моем приложении довольно странный список источников (вытащенный из библиотеки объектов) с NSTreeController
в качестве источника данных. Я установил NSTextField
внутри DataCell для редактирования, но я хочу иметь возможность отключить это для некоторых ячеек. Я подумал, что вы сделаете это, используя делегат для NSTextField
, но ни один из методов делегата, которые я пробовал, вызывается. Я что-то упускаю? У меня есть делегат с выходом в моей XIB, и он также является делегатом владельца NSOutlineView
, реализующего оба протокола NSOutlineViewDelegate
и NSTextFieldDelegate
.
Кроме того, я также не могу использовать старый метод –outlineView:shouldEditTableColumn:item:
NSOutlineViewDelegate
, поскольку он работает только с базовыми представлениями на основе ячеек ( Я предполагаю, что это так - документация по Outline View не Похоже, что он был обновлен для Lion, хотя аналогичная документация NSTableView
имеет, и эти методы не вызываются либо ).
Обновление
Я воспроизвел это в новом тестовом проекте, так что он определенно не связан ни с одним из моих пользовательских классов. Следуйте приведенным ниже инструкциям, чтобы создать пример проекта и воспроизвести эту проблему.
- В Xcode 4.1 создайте новый проект типа Mac OS X Cocoa Application без специальных параметров
- Создайте два новых файла, SourceListDataSource.m и SourceListDelegate.m , с содержанием, указанным ниже
- В MainMenu.xib перетащите
Source List
в окно
- Перетащите два
Object
s на док-станцию (левая сторона окна), указав класс SourceListDataSource
для одного и SourceListDelegate
для другого
- Подключите выходы Outline View
dataSource
и delegate
к этим двум объектам
- Выберите статический текст
NSTextField
для представления DataCell внутри столбца представления структуры
- Включите привязку
Value
, сохраняя настройки по умолчанию
- Подключите его
delegate
выход к объекту делегата списка источников
- Установите для свойства
Behavior
значение Editable
- Построить и запустить, затем дважды щелкнуть по любой ячейке в виде структуры.
Ожидается : поле недоступно для редактирования, и есть "хорошо, я должен?" сообщение в журнале
Actual : поле доступно для редактирования, и сообщения не регистрируются
Это ошибка в фреймворке, или я должен добиться этого по-другому?
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