Domanda

nella mia applicazione ho creato un'associazione molto semplice. Ho un NSMutableArray associato a un NSArrayController. Il controller stesso è associato a un ComboBox e mostra tutto il contenuto di NSMutableArray. Funziona bene.

Il problema è: il contenuto dell'array cambierà. Se l'utente apporta alcune modifiche all'app, elimino tutti gli elementi nell'array NSMuteable e lo riempio con elementi nuovi e diversi.

Ma l'associazione di NSMutableArray < - > NSArrayController & Lt; - & Gt; NSComboBox non si aggiorna.

Non importa se rimuovo tutti gli oggetti dall'array, il ComboBox mostra ancora gli stessi elementi.

Cosa c'è che non va qui? Il mio approccio è sbagliato o devo solo dire alla rilegatura di aggiornarsi? Non ho scoperto come farlo.

È stato utile?

Soluzione

Probabilmente " modifica l'array dietro il controller " ;, che sovverte il meccanismo KVO.

Hai detto:

  

Ho un NSMutableArray associato a un NSArrayController.

Come? Dove vive l'array? In un documento, accessibile tramite KVC / KVO conforme -myArray / -setMyArray: set di accessori?

Scommetto che stai dicendo direttamente il " myArray " ivar a -removeAllObjects, giusto? In che modo questi accessori KVC / KVO & Quot; know & Quot; l'array è cambiato?

La risposta è che non lo fanno. Se stai davvero sostituendo l'intero array, vorrai dire al tuo documento (o a chiunque sia proprietario dell'array) di -setMyArray: a un intero nuovo array. Ciò attiverà le chiamate KVO appropriate.

... ma poi, non hai davvero bisogno di un array mutabile, vero? Se desideri solo sostituire singoli elementi dell'array, ti consigliamo di utilizzare gli accessori indicizzati:

(Documentazione: consultare la sezione Modelli di accessori di raccolta per proprietà To-Many) http://tinyurl.com/yb2zkr5

Altri suggerimenti

Prova questo (usando ARC / OS X 10.7):

nel file di intestazione, definire arrayInstance e arrayController

 @property (weak) IBOutlet NSArrayController *arrayController;
 @property (strong) NSArray *arrayInstance; // for the array instance

quindi in fase di implementazione

 @synthesize arrayController = _arrayController;
 @synthesize arrayInstance = _arrayInstance;

 _arrayInstance = .......  // What ever the new array will be
 [_arrayController setContent:_arrayInstance];

Ciò costringerà arrayController ad aggiornare il contenuto e visualizzarlo correttamente.

Un'altra soluzione diversa da 2 righe di codice sarebbe:

 [self willChangeValueForKey:@"arrayInstance"];
 _arrayInstance = .......  // What ever the new array will be
 [self didChangeValueForKey:@"arrayInstance"];

Pensa che il primo appaia più ovvio, il secondo più simile a KVO.

La conformità KVC / KVO sembra essere il problema. È necessario creare il nuovo array e aggiornare il riferimento con il nuovo oggetto utilizzando i metodi di accesso generati. In caso contrario, puoi inviare messaggi KVO sull'array in fase di aggiornamento per informare i binding, che i contenuti dell'array sono cambiati.

Christian

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