NSTextField не вызывает делегата, когда находится внутри NSTableCellView

У меня есть довольно простой исходный список (вытащенный из библиотеки объектов) в моем приложении с NSTreeController в качестве его источник данных. Я установил NSTextField внутри DataCell для редактирования, но я хочу иметь возможность отключить это для некоторых ячеек. Я предполагал, что вы сделаете это с помощью делегата для NSTextField , но ни один из методов делегата, которые я пробовал, не вызывается. Что-то мне не хватает? У меня есть делегат, установленный с выходом в моем XIB, и он также является делегатом владельца NSOutlineView , реализующего как NSOutlineViewDelegate , так и NSTextFieldDelegate ].

Кроме того, я не могу использовать старый метод –outlineView: shouldEditTableColumn: item: NSOutlineViewDelegate , так как он работает только с представлениями структуры на основе ячеек ( I Предполагаю, что это так - документация Outline View, похоже, не была обновлена ​​для Lion, хотя аналогичная документация NSTableView есть, и эти методы также не вызываются ).

Обновление

Я воспроизвел это в новом тестовом проекте, поэтому оно определенно не связано ни с одним из моих пользовательских классов. Выполните следующие шаги, чтобы создать мой пример проекта и воспроизвести эту проблему.

  1. В Xcode 4.1 создайте новый проект типа Mac OS X Cocoa Application без каких-либо выбранных специальных параметров
  2. Создайте два новых файла, SourceListDataSource.m и SourceListDelegate.m с содержанием, указанным ниже
  3. В MainMenu.xib перетащите Source List в окно
  4. Перетащите два Object на доке (левая часть окна), указав класс SourceListDataSource для одного и SourceListDelegate для другого
  5. Подключите Outline View's dataSource и делегируют выходы этим двум объектам
  6. Выберите статический текст NSTextField для представления DataCell внутри столбца представления структуры
  7. Включите его Значение привязка с сохранением настроек по умолчанию
  8. Подключите его делегата o utlet к объекту делегата списка источников
  9. Установите для его свойства Behavior значение Editable
  10. Build and Run, затем дважды щелкните любую ячейку в представлении структуры.

Expected : Поле не редактируется, и есть "ну а я должен?" сообщение в журнале

Фактическое : поле доступно для редактирования, сообщения не регистрируются

Это ошибка в структуре, или я должен добиться этого другим способом?


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
6
задан Dov 19 August 2011 в 15:43
поделиться