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?

Foi útil?

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.

  1. subclasse NSView.
  2. 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.
  3. 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 delegado index.
  4. 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 propriedade representedObject em NSCollectionViewItem.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top