Récupérer le contenu d'un NSArrayController
cargo
Membre
<br />- (NSNumber*) monNombre<br />{<br />return [NSNumber numberWithDouble:[[outlet_monArrayController valueForKeyPath:@"selection.maValeur"]doubleValue]];<br />}<br />
Ce code est dans une catégorie de MyDocument.
J'ai un textField bindé comme suit pour récupérer monNombre :
Bind to: File's Owner
Ck :----
Mkp : monNombre
Le résultat dans le textField est comme si la sélection était vide en fait (mot selection grisé), il ne m'affiche pas le nombre.
Je ne comprends pas.
L'outlet est ok.
Si je bind le textField directement au controller dans IB pas de problème il m'affiche la valeur souhaitée.
Si je renvoie le nombre 1 par exemple dans la catégorie de MyDocument, pas de problème il l'affiche.
Peut-être parce que je ne passe pas par le managedObjectContext en fait, je bind en direct sur le file's owner ?
Je ne sais pas, je pète un câble. L'exemple ici est simplifié, en fait j'en ai besoin pour faire qqchose de plus complexe.
:why?:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
La solution est la suivante : il faut que tu observes (avec KVO) la selection de l'arrayController et que tu utilises willChangeValueForKey: et surtout didChangeValueForKey: et normalement tout devrait rentrer dans l'ordre ...
Donc je dois ajouter un observer dans awakeFromNib (ou dans inithWithType?) c'est à dire que j'ajoute MyDocument comme un observer de selection.maValeur (ou de selection tout court?). Je suppose que je dois le remover à la fin de l'exécution de l'appli.
Le problème au niveau des accesseurs (car j'ai déjà essayé) c'est que [self willChangeValueForKey...] ça marche pas apparemment dans MyDocument, j'ai une alerte comme quoi il ne répondrait pas à willChangeValueForKey. Je me demandais si c'était normal d'avoir des accesseurs dans MyDocument, normalement ça concerne le modèle ça, mais dans le modèle on ne peut pas récupérer le contenu dans arrayController...
Ou alors binder dans le code ? Qu'est ce que je pourrais binder à ce controller dans le code en fait ? J'aimerais bien savoir ce qui est sous-jacent au binding, ça m'aiderait...
Ca ça me rassure pas :
http://www.objective-cocoa.org/forum/index.php/topic,2019.0.html
Je crois que je vais me tourner vers une autre solution...
Le fait d'avoir des accesseurs dans un controller n'est pas un problème. En effet, le MVC n'est qu'une convention (donc aucune obligation de coder en style MVC avec Cocoa) et qui en plus n'interdit pas de mettre des accesseurs à un controlleur ou a une vue. Imaginons par exemple un vue avec un mécanisme de zoom : il va bien falloir stocker la valeur de ce zoom quelquepart et ca surement pas dans des modèles donc soit dans la vue, soit dans le controlleur.
Finalement, dans ton MyDocument.m, tu dois faire un truc du genre :
Si tu utilises déjà le KVO dans ton MyDocument, tu as intérêt à tester keyPath ou object pour vérifier que c'est bien la bonne clé (selection) ou le bon object (_arrayController) ...
Du coup je comprends plus comment binder mon textField cà d récupérer mon résultat, puisque je fais mon calcul dans une fonction void. Ou alors je fais le calcul ailleurs et "là " je récupère la valeur et je l'attribue à la clef...
En tous cas merci, c'est + clair déjà . ::)