NSTextField não chamando delegado quando dentro de um NSTableCellView
Tenho uma lista de fontes bastante baunilha (arrastada da Biblioteca de objetos) no meu aplicativo, com umNSTreeController
como fonte de dados. Eu defino oNSTextField
dentro de DataCell para ser editável, mas quero poder desativá-lo para algumas células. A maneira que eu imaginei que você faria isso é com um delegado para oNSTextField
, mas nenhum dos métodos delegados que eu tentei foi chamado. Tem algo que estou perdendo? Eu tenho o delegado definido com uma saída no meu XIB e, por acaso, ele é o delegado do proprietárioNSOutlineView
, implementando também oNSOutlineViewDelegate
eNSTextFieldDelegate
rotocolo
Também não posso usar o antigo–outlineView:shouldEditTableColumn:item:
NSOutlineViewDelegate
, já que isso funciona apenas com vistas de estrutura de tópicos baseadas em células Suponho que seja esse o caso - a documentação do Outline View não parece ter sido atualizada para o Lion, embora os análogosNSTableView
documentação possui, e esses métodos também não são chamados).
Reproduzi isso em um novo projeto de teste, por isso definitivamente não está relacionado a nenhuma das minhas aulas personalizadas. Siga as etapas abaixo para criar meu projeto de amostra e reproduzir este problem
No Xcode 4.1, crie um novo projeto, do tipo Mac OS X Cocoa Application, sem nenhuma opção especial selecionadarie dois novos arquivo SourceListDataSource.m e SourceListDelegate.m, com o conteúdo especificado abaixoNo MainMenu.xib, arraste umSource List
na janelaDrag twoObject
s no dock (lado esquerdo da janela), especificando oSourceListDataSource
classe para um e oSourceListDelegate
para o outrConecte a visualização de estrutura de tópicosdataSource
edelegate
saídas para esses dois objetosSelecione o texto estáticoNSTextField
para a visualização DataCell dentro da coluna da visualização de estrutura de tópicosLigue o seuValue
ligação, mantendo as configurações padrãoConecte seudelegate
saída para o objeto Delegado da Lista de OrigemSet itsBehavior
propriedade para EditávelBuild and Run, clique duas vezes em uma das células na exibição de estrutura de tópicoEsperad: O campo não é editável e existe um "bem, devo?" mensagem no log
Rea: O campo é editável e nenhuma mensagem é registrada
Isso é um bug na estrutura ou devo fazer isso de uma maneira diferent
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