Domanda

Ho una vista che viene utilizzato in tutte le mie CollectionView degli articoli.Ho un IBOutlet per il CollectionViewItem dal mio punto di vista e che ho collegato in Interface Builder.Voglio accedere a un valore dal representedObject (che è un Nucleo di Dati oggetto) a mio modo di vedere il codice.Qui è un esempio di quello che sto cercando di fare -- accedere a un valore di sequenza di representedObject:

Nell' .h file:

IBOutlet NSCollectionViewItem *item; // Connected in IB

Nell' .m file

NSString *seq = [[item representedObject] valueForKey:@"seq"];
NSLog(@"Seq: %@", seq); // returns Seq: (null)

So che il seq è popolata perché l'ho legato a una etichetta in CollectionViewItem vista in IB utilizzando il representedObject.seq percorso della chiave e che funziona.

Qualche idea del perché quando cerco di accedere al valore per seq nel codice per la visualizzazione restituisce null?

È stato utile?

Soluzione

E 'molto probabile che NSCollectionViewItem non copia su connessioni IBOutlet da loro viste dell'elemento al prototipo NSCollectionViewItem. Quindi, item è nullo, così seq sarà anche nullo.

Il modello tipico per l'accesso l'istanza NSCollectionViewItem è quello di legarsi al prototipo. Lei parla che avete fatto questo e quello funziona. Questo è semplicemente perché questo è il tipico modo, supportata di farlo.

Se si ha realmente bisogno di una connessione direttamente alla voce in un modo che attacchi non possono fornire, probabilmente dovrete configurarlo manualmente. Un modo per farlo è ignorare -copyWithZone: di NSCollectionViewItem, chiamare super, quindi effettuare il collegamento manualmente.

Altri suggerimenti

1) Sottoclasse l'NSView che viene utilizzato per il rendering di un elemento nella collezione vista

2) In questa sottoclasse, aggiungere un delegato di proprietà

3) Sublcass il NSCollectionViewItem

4) Ignorare i setView:metodo.Aggiungere una riga per impostare il delegato di proprietà della vista per il NSCollectionViewItem istanza (cioèself).

Ora, all'interno di NSView sottoclasse, si avrà accesso al corrispondente NSCollectionView articolo tramite il delegato proprietà (ad es.è possibile accedere sua representedObject).

Ho avuto lo stesso problema, ma ha trovato una soluzione molto semplice: ho messo la vista in un .xib diverso e collegato questo nel NSCollectionViewItem (che in realtà è un NSViewController). Poi il .xib sarà deserializzare per ogni cella e sono impostati tutti i punti vendita.

  1. sottoclasse NSView.
  2. Aggiungi metodo delegato a tale sottoclasse ... qualcosa come - (void)mouseDownOnItemAtIndex:(NSUInteger)index a dire l'ascoltatore che l'utente fa clic su un elemento in un indice specifico.
  3. Tirare la vista collezione utilizzando self.superview nella stessa classe. Creare una variabile per memorizzare un NSUInteger. Conservare l'indice della voce utilizzando il metodo [[collectionView subviews] indexOfObject:self]. Passare che indice nel parametro del metodo delegato index.
  4. La classe che è conforme al protocollo definito nel NSView saranno ora in grado di sentire da eventuali eventi MouseDown in una cella specifica. Se si desidera che il representedObject di un elemento specifico, basta chiamare collectionView:itemAtIndex e ottenere la voce accedendo tramite la proprietà representedObject su NSCollectionViewItem.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top