Como faço para obter o representedObject de uma vista em uma NSCollectionViewItem?
-
13-09-2019 - |
Pergunta
Eu tenho uma visão que é usado em cada um dos itens do meu CollectionView. Eu tenho um IBOutlet ao CollectionViewItem de minha vista e eu tenho que se viciado no Interface Builder. Eu quero acessar um valor do representedObject (que é um objeto Core Data) no meu código vista. Aqui está um exemplo do que eu estou tentando fazer - o acesso de um valor da seqüência do representedObject:
No arquivo .h:
IBOutlet NSCollectionViewItem *item; // Connected in IB
No arquivo .m
NSString *seq = [[item representedObject] valueForKey:@"seq"];
NSLog(@"Seq: %@", seq); // returns Seq: (null)
Eu sei que a seq é preenchida porque eu tê-lo binded a uma etiqueta na vista CollectionViewItem em IB utilizando o caminho da chave representedObject.seq e que funciona.
Qualquer idéia porque quando tento acessar o valor de seq no código para a vista ele retorna nulo?
Solução
É muito provável que NSCollectionViewItem não copia através de conexões IBOutlet de vista deles do item para o protótipo NSCollectionViewItem. Assim, item
é nulo, então seq
também será nulo.
O padrão típico para acessar a instância NSCollectionViewItem é ligar para o protótipo. Você menciona que você fez isso e que ele funciona. Isso é simplesmente porque essa é a típica maneira, apoiado de fazê-lo.
Se você realmente precisa de uma conexão diretamente para o item de uma forma que as ligações não pode fornecer, você provavelmente terá que configurá-lo manualmente. Uma maneira de fazer isso é -copyWithZone:
substituição de NSCollectionViewItem, chamada super, em seguida, fazer a conexão manualmente.
Outras dicas
1) subclasse o NSView que é utilizado para a prestação de um item na visão de coleção
2) Nesta subclasse, adicionar uma propriedade delegado
3) Sublcass o NSCollectionViewItem
4) Substituir o setView: método. Adicionar uma linha para definir a propriedade de delegado a vista para o exemplo NSCollectionViewItem (isto é, auto).
Agora, dentro NSView subclasse, você terá acesso ao item NSCollectionView correspondente via a propriedade delegado (por exemplo, você pode acessar sua representedObject).
Eu tive o mesmo problema, mas encontrou uma solução muito fácil: Eu coloquei o ponto de vista em um .xib diferente e ligada isso no NSCollectionViewItem (que na verdade é um NSViewController). Em seguida, a .xib será desserializado para cada célula e todas as tomadas estão definidos.
- subclasse NSView.
- Adicionar método delegado disse subclasse ... algo como
- (void)mouseDownOnItemAtIndex:(NSUInteger)index
para dizer ao ouvinte que o usuário clicou em um item em um índice específico. - Puxe a visão de coleção usando self.superview na mesma classe. Criar uma variável para armazenar um NSUInteger. Armazenar o índice do item usando o
[[collectionView subviews] indexOfObject:self]
método. Passe esse índice no parâmetro do método delegadoindex
. - A classe que está em conformidade com o protocolo definido na sua NSView agora será capaz de ouvir de eventos mousedown em uma célula específica. Se quiser que o representedObject de um item específico, basta ligar
collectionView:itemAtIndex
e obter o item, acessando-o por meio da propriedaderepresentedObject
emNSCollectionViewItem
.