Pergunta

Eu criei com sucesso um NSCollectionView e acrescentou um rótulo para o protótipo exibição no IB, vinculado a uma propriedade de meu objeto representado. Agora eu quero programaticamente criar um NSButton e NSTextField com o NSTextField vinculado a uma propriedade de meu objeto representado. Quando o botão é clicado eu quero mostrar e ocultar a NSTextField.

O problema que eu me deparei é se eu colocar o meu código de inicialização para meus controles no método initWithCoder da vista, e a ligação em awakeFromNib do ponto de vista, a ligação não se levanta viciado. Se eu colocar a inicialização para os meus controles no awakeFromNib, quando o botão é clicado, eu não tenho acesso aos controles na minha opinião (que são nulos quando impresso usando NSLog).

De que eu posso dizer, parece que o problema pode ser que o caminho NSCollectionView funciona é, ele cria uma instância da vista, em seguida, copia-o para a forma como cada muitos objetos estão na visão de coleção. Como faço para obter os botões para inicializar e a ligação ao trabalho com a cópia do protótipo?

Abaixo está o meu código de inicialização e minha ligação na awakeFromNib para meu ponto de vista subclasse:

SubView.h

@interface SubView : NSView {
    NSButton *button;
    NSTextField *textField;
    IBOutlet NSCollectionViewItem *item; // Connected in IB to my NSCollectionViewItem
}

- (IBAction)buttonClicked:(id)sender;

@end

SubView.m

@implementation SubView

- (id)initWithCoder:(NSCoder *)decoder
{
    id view = [super initWithCoder:decoder];

    button = [[NSButton alloc] initWithFrame:NSMakeRect(50, 95, 100, 20)];
    [button setTitle:@"Begin Editing"];
    [button setTarget:self];
    [button setAction:@selector(buttonClicked:)];
    [self addSubview:button];

    textField = [[NSTextField alloc] initWithFrame:NSMakeRect(10, 10, 100, 75)];
    [self addSubview:textField];

    return(view);
}

- (void)awakeFromNib
{   
        // Bind the textField to the representedObject's name property
        [textField bind:@"value" 
       toObject:item 
        withKeyPath:@"representedObject.name" 
        options:nil];
}

- (IBAction)buttonClicked:(id)sender
{
    [button setTitle:@"End Editing"];
    [textField setHidden:YES];
}

@end
Foi útil?

Solução

Este sons semelhantes a algo que eu apenas fiz, talvez por isso é que você precisa.

NSCollectionView e substituição:

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object

Em newItemForRepresentedObject:, retreive o item vista, em seguida, adicionar seus controles e quaisquer ligações programáticas:

@implementation NSCollectionViewSubclass

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object {

    // Allow the superclass to create or copy the collection view item
    NSSCollectionViewItem *newItem = [super newItemForRepresentedObject:object];

    // Get the new item's view so you can mess with it
    NSView *itemView = [newItem view];

    //
    // add your controls to the view here, bind, etc
    //

    return newItem;
}

@end

Esperamos que este é um lugar perto de onde você precisa ser ...

Outras dicas

-awakeFromNib não é chamado no modo de exibição para uma NSCollectionViewItem se que a visão está na mesma ponta como o NSCollectionView, mas é chamado, se você colocar a visão em um bico separado.

  • Crie um arquivo nib vazio (BlahBlahCollectionViewItem.nib).
  • Cortar a tela do item coleção fora de qualquer nib você tem isso em
  • Cole-o para o novo arquivo nib
  • Altere a classe de seu proprietário para NSCollectionViewItem.
  • Ligue a tomada de vista sobre o proprietário para uma visualização recentemente colado
  • Abra o arquivo nib contendo o NSViewController
  • Selecione o associado NSViewControllerItem
  • Altere sua propriedade Nib nome para o nome do novo nib
  • Mantenha seu código em -awakeFromNib

-awakeFromNib não é chamado para vistas copiados do protótipo NSCollectionViewItem. Coloque seu código obrigatório em initWithCoder: e você deve ser fino.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top