Como faço para vincular programaticamente na vista subclasse da minha NSCollectionView?
-
06-07-2019 - |
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
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.