0

Je n'arrive pas à trouver la bonne façon de lier un NSArrayController (lié à son tour par une vue de table) à une propriété NSArray d'une instance de NSDocument via un contrôleur de vue.Comment lier un contrôleur RAID à une propriété de tableau NSDocument?

Ma sous-classe NSDocument a la propriété NSArray * pages. J'ai d'abord reflété la propriété pages dans le contrôleur de vue, mais cela signifie que la vue de table ne se met pas à jour lorsque NSDocument ajoute des éléments à son tableau pages. Les seules façons de forcer une mise à jour dans ce cas sont will../didChangeValueForKey:@"pages" dans le contrôleur de vue, mais ce n'est pas pratique lorsque la modification n'est pas déclenchée à partir du contrôleur de vue. L'appel au will/didChangeValueForKey dans NSDocument n'entraîne pas directement la mise à jour du contrôleur RAID.

J'ai essayé de me lier directement au document.pages du ViewController, mais cela ne semble pas fonctionner, ou du moins n'affiche aucune mise à jour.

Quelle serait la bonne technique à utiliser ici?

+0

Avez-vous vérifié si la propriété 'pages' suit les règles de [Conformité KVO] (https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/KeyValueObserving/Articles/KVOCompliance.html#//apple_ref/doc/uid/20002178-BAJEAIEE)? – Willeke

+0

Étant donné que NSDocument hérite de NSObject, je suppose qu'il est compatible avec KVO. La propriété pages est définie comme '@property (nonatomic, strong) NSMutableArray * pages;' - d'après ce que je comprends, cela devrait être tout ce qui est nécessaire, non? – fbitterlich

+0

Si vous faites 'self.pages = someArray' oui, si vous faites' [self.pages addObject: someObject] 'non. Vous devez utiliser 'mutableArrayValueForKey:' ou 'willChange: valuesAtIndexes: forKey:'/'didChange: valuesAtIndexes: forKey:'. – Willeke

Répondre

0

Résolu - même si le problème n'était pas là où je le cherchais.

I est obligatoire le contrôleur RAID à une propriété document créé comme ceci:

- (Document *)document { 
    return (Document *)self.view.window.windowController.document; 
} 

qui ne fonctionne pas, car il n'est pas KVO compatible. La solution consistait simplement à affecter l'instance NSDocument à self.representedObject, qui est une propriété "réelle" et donc observable.

changements d'emballage à la matrice pages dans willChangeValudForKey:/didChangeValueForKey: ne fonctionne pour mettre à jour le contrôleur RAID lié comme prévu, bien que les versions plus spécifiques Willeke proposés dans son commentaire sont probablement plus correct.