Domanda

Sto riscontrando dei problemi nella visualizzazione del contenuto di un NSArrayController in due finestre definite in XIB diversi.

Nella mia finestra principale (in MainMenu.xib), ho un NSTableView che è associato a un NSArrayController

Nel mio secondo XIB, ho un'altra finestra che contiene un NSTableView. Ho creato un nuovo NSArrayController e ho associato la tabella al contenuto di quel NSArrayController.

Entrambi i controller NSArray sono associati allo stesso NSArray.

All'inizio va tutto bene, ma il problema è che se un oggetto viene aggiunto all'array usando NSArrayController nella finestra principale, la vista dei dati della finestra secondaria non viene aggiornata. Questo è molto probabilmente perché non sa che deve aggiornarsi, dal momento che il suo NSArrayController non è stato utilizzato per aggiungere il nuovo oggetto.

Quello che vorrei fare è usare la stessa identica istanza di NSArrayController in entrambe le finestre. In questo modo se un oggetto viene aggiunto all'array, entrambe le viste verranno avvisate della modifica.

Il problema è che non riesco a capire come fare in Interface Builder. Non riesco a associare un NSArrayController a un altro NSArrayController (viene visualizzato un errore di runtime che indica che può essere associato solo a un NSArray). La connessione di NSArrayController al membro NSArrayController del proprietario del file non aiuta neanche, dal momento che ciò cancellerà semplicemente NSArrayController che voglio che usi.

Suppongo che potrei impostare da solo i collegamenti nel codice, ma sembra che sarebbe meglio usare Interface Builder se possibile. C'è un modo per farlo in Interface Builder o forse un modo migliore per impostare tutto insieme?

Aggiornamento: in risposta alla risposta e ai commenti di Chuck, ho provato quanto segue: -Bound il contenuto della tabella del mio NSTableView agli arrangiamentoObject del membro NSArrayController (se utilizzavo NSArrayController stesso, nel registro compariva un errore: " [NSArrayController count]: selettore non riconosciuto inviato all'istanza ") -Bound ogni colonna della tabella al proprietario del file, con un percorso chiave modello di arrayController.arrangedObjects.propertyName

Ciò non ha comunque comportato l'aggiornamento dei contenuti della tabella. Penso che ciò sia dovuto al fatto che sono vincolante per gli oggetti organizzati di NSArrayController, piuttosto che per NSArrayController stesso. Ma, se mi associo direttamente a NSArrayController, ciò mi dà errori.

Normalmente, selezionerei il mio NSArrayController da " Bind to " ComboBox, usa organizzatoObjects come chiave del controller e la proprietà stessa come percorso della chiave del modello. Non sono sicuro di come fare l'equivalente di questo in questo caso - se posso assolutamente.

Ho fatto qualcosa di sbagliato nel processo sopra?

È stato utile?

Soluzione

L'opzione migliore che sono stato in grado di escogitare è di notificare al secondo NSArrayController che l'array che sta gestendo è cambiato chiamando rearrangeObjects: su di esso. Sembra goffo, ma funziona.

Altri suggerimenti

Che ne dici di impostarli come oggetti proxy in IB e quindi creare un'istanza del codice reale, forse nel delegato della tua app?

È possibile ottenere l'aggiornamento di entrambi NSArrayControllers tramite KVO quando si aggiunge l'array. Il trucco è che devi osservare e aggiungere l'array in modo conforme a KVO.

Vorresti un oggetto che possiede l'array, chiamiamolo " modello " ;. L'array deve essere una chiave sull'oggetto, chiamiamo la chiave "contentArray". Successivamente, quando aggiungi / rimuovi da, dovresti farlo chiamando prima mutableArrayForKey su " modello " per ottenere " contentArray " ;. Quindi l'aggiunta / rimozione dall'array dovrebbe funzionare, ad esempio:

Controller1 è associato a self.model.contentArray

Controller2 è associato a self.model.contentArray

//this method is on the "model" object
-(void)addContent(id content)
{
    NSMutableArray* contentArr = [self mutableArrayForKey:@"contentArray"];
    [contentArr addObject:content]; //this will trigger KVO notifications
}

In alternativa puoi fare manualmente le notifiche KVO in questo modo:

-(void)addContent(id content)
{
    [self willChangeValueForKey:@"contentArray"];
    [m_contentArray addObject:content];
    [self didChangeValueForKey:@"contentArray"];
}

Non c'è motivo per cui due controller di array non debbano fare in modo che una vista non si aggiorni quando si aggiorna attraverso un'altra. Se non succede, sembra che le tue notifiche KVO si stiano perdendo da qualche parte. Molto probabilmente stai modificando direttamente un array (nel metodo aggiungi: di una sottoclasse NSArrayController, forse?) Senza inviare le notifiche di modifica appropriate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top