2009-07-14 12 views
6

Ho una vista che viene utilizzata in ciascuno degli elementi della mia CollezioneView. Ho un IBOutlet per il CollectionViewItem dalla mia vista e ho quello collegato in Interface Builder. Voglio accedere a un valore da representObject (che è un oggetto Core Data) nel mio codice di vista. Ecco un esempio di quello che sto cercando di fare - accedere ad un valore di sequenza del representedObject:Come si ottiene representObject da una vista in NSCollectionViewItem?

Nel file .h:

IBOutlet NSCollectionViewItem *item; // Connected in IB 

Nel file .m

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

So che il seq viene compilato perché è stato associato a un'etichetta nella vista CollectionViewItem in IB utilizzando il percorso chiave representObject.seq e ciò funziona.

Qualche idea sul perché quando provo ad accedere al valore per seq nel codice per la vista restituisce null?

risposta

1

È molto probabile che NSCollectionViewItem non copi sulle connessioni di IBOutlet dalle viste degli elementi al prototipo NSCollectionViewItem. Quindi, item è nullo, quindi seq sarà anch'esso pari a zero.

Il modello tipico per accedere all'istanza NSCollectionViewItem consiste nel collegarsi al prototipo. Dici che hai fatto questo e che funziona. Questo è semplicemente perché è il modo tipico e supportato per farlo.

Se è davvero necessaria una connessione diretta all'elemento in un modo che i collegamenti non possono fornire, è probabile che sia necessario configurarlo manualmente. Un modo per farlo è sovrascrivere il numero di NSCollectionViewItem -copyWithZone:, chiamare super, quindi effettuare la connessione manualmente.

+0

Grazie, ha fatto il trucco. – Austin

+1

Sono confuso da questa risposta. Innanzitutto, @kperryua afferma "Il modello tipico per accedere all'istanza di NSCollectionViewItem consiste nel collegarsi al prototipo, dicendo che l'hai fatto e che funziona." Ma la domanda di @ Austin menziona solo l'uso del "percorso della chiave representObject.seq" e in effetti è difficile vedere come si legherebbe l'elemento di collectionViewPrototype a una vista di collectionViewItem. Dico che è impossibile, ma sono felice di essere stato smentito. In secondo luogo, la documentazione di Apple per copyWithZone di NSObject: afferma esplicitamente "Non si deve sovrascrivere questo metodo." –

+0

Overriding copyWithZone: è abbastanza sicuro finché la superclasse allocWithZone: viene chiamata al suo interno. Non ho controllato per vedere se effettivamente dicono di non farlo, ma in qualche modo penso che tu possa averlo confuso con allocWithZone: o alcuni di questi. – ctpenrose

1

1) sottoclasse il NSView che viene utilizzato per rendere un elemento nella vista raccolta

2) In questa sottoclasse, aggiungere una proprietà delegato

3) Sublcass il NSCollectionViewItem

4) Override il metodo setView:. Aggiungi una linea per impostare la proprietà delegato della vista sull'istanza NSCollectionViewItem (cioè self).

Ora, all'interno della sottoclasse NSView, si avrà accesso all'elemento NSCollectionView corrispondente tramite la proprietà delegate (ad esempio, è possibile accedere al suo oggetto rappresentato).

+0

Il metodo setView sta per essere deprecato (è identificato come applicabile a 10.5 e 10.6 nella documentazione di Apple) sebbene sia chiamato in 10.7, per quanto tempo questo continuerà non è specificato. – rougeExciter

0

Ho avuto lo stesso problema, ma ho trovato una soluzione molto semplice: ho inserito la vista in un file .xib diverso e l'ho collegata in NSCollectionViewItem (che in realtà è un NSViewController). Quindi il .xib verrà deserializzato per ogni cella e tutte le prese saranno impostate.

0
  1. Sottoclasse NSView.
  2. Aggiungi metodo delegato a detta sottoclasse ... qualcosa come - (void)mouseDownOnItemAtIndex:(NSUInteger)index per dire al listener che l'utente ha fatto clic su un elemento su un indice specifico.
  3. Estrarre la vista raccolta utilizzando self.superview nella stessa classe. Creare una variabile per memorizzare un NSUInteger. Memorizzare l'indice dell'articolo utilizzando il metodo [[collectionView subviews] indexOfObject:self]. Passare tale indice nel parametro del metodo delegato index.
  4. La classe conforme al protocollo definito nel NSView sarà ora in grado di ascoltare da qualsiasi evento di mouse in una cella specifica. Se si desidera l'oggetto rappresentato di un elemento specifico, è sufficiente chiamare collectionView:itemAtIndex e ottenere l'elemento accedendo tramite la proprietà representedObject su NSCollectionViewItem.
Problemi correlati