[Résolu] binding entre NSArrayController et NSView perso bi-directionnel
Bonjour,
je suis en train de coder une vue personnalisé afin de récupérer le chemin du fichier qu'on vient de glisser dessus et d'en afficher un aperçu.
Cette vue doit être liée à un NSArrayController afin de dialoguer avec mon managed objectModel.
Actuellement mon binding est unidirectionnel, si une modification est faite sur les données gérées par mon NSArrayCOntroller, ma vue est bien informée. mais dans l'autre sens ça ne marche pas.
Dans ma vue personalisées j'ai ajouter les lignes suivantes pour informer du binding :
dans mon code principal je réalise le "lien" de cette façon :
au final vuePerso est bien informé des changements, mais pas l'inverse !
j'ai donc tenter d'ajouter ceci dans mon "windowControllerDidLoadNib"
mais cela me provoque une erreur dès que ma variable est mise a jour :
this class is not key value coding-compliant for the key selection.cheminPhoto
j'ai du mal a voir ce qui ne marche pas.
je suis en train de coder une vue personnalisé afin de récupérer le chemin du fichier qu'on vient de glisser dessus et d'en afficher un aperçu.
Cette vue doit être liée à un NSArrayController afin de dialoguer avec mon managed objectModel.
Actuellement mon binding est unidirectionnel, si une modification est faite sur les données gérées par mon NSArrayCOntroller, ma vue est bien informée. mais dans l'autre sens ça ne marche pas.
Dans ma vue personalisées j'ai ajouter les lignes suivantes pour informer du binding :
+ (void)initialize<br />{<br /> [self exposeBinding:@"pathToPicture"];<br />}<br /><br /><br />-(NSString *)pathToPicture{<br /> NSLog(@"pathToPicture %@",pathToPicture);<br /> return pathToPicture;<br />}<br /><br />-(void)setPathToPicture:(NSString *)newPathToPicture{<br /> <br /> [self willChangeValueForKey:@"pathToPicture"];<br /> [pathToPicture release];<br /> pathToPicture = [newPathToPicture copy];<br /> [self didChangeValueForKey:@"pathToPicture"];<br /> NSLog(@"setPathToPicture %@",pathToPicture);<br />}
dans mon code principal je réalise le "lien" de cette façon :
<br />- (void)windowControllerDidLoadNib:(NSWindowController *) windowController <br />{<br /> [super windowControllerDidLoadNib:windowController];<br /> [vuePerso bind:@"pathToPicture" toObject:monArrayController withKeyPath:@"selection.cheminPhoto" options:nil];<br /> <br />}<br />
au final vuePerso est bien informé des changements, mais pas l'inverse !
j'ai donc tenter d'ajouter ceci dans mon "windowControllerDidLoadNib"
<br />[monArrayController bind:@"selection.cheminPhoto" toObject:vuePerso withKeyPath:@"pathToPicture" options:nil];<br />
mais cela me provoque une erreur dès que ma variable est mise a jour :
this class is not key value coding-compliant for the key selection.cheminPhoto
j'ai du mal a voir ce qui ne marche pas.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Il faut donc écrire:
observedObjectForPathToPicture et keyPathForPathToPicture sont les objets qui ont été passés à -[bind:toObject:withKeyPath:options:] et que tu as mémorisé, comme indiqué dans le Cocoa Binding Guide. Il faut faire passer la valeur par le NSValueTransformer avant, s'il y en a un.
P.S.: Peut-être que ta vue fait autre chose, mais il existe une classe NSPathControl.
Effectivement, il manquait bien l'enregistrement en retour.
j'ai donc ajouté ceci au code de ma vue personalisée :
mon setPathToPicture a aussi été modifié comme ceci :
j'ai aussi ajouté le code pour mettre à jour la propriété de ma vue personalisée :
mais le dictionnaire me renvoi des clefs NULL, alors qu'il y a bien une valeur existante dans la sélection de mon NSArrayController.
Ce site est indispensable pour tout ce qui est bindings.
Regarde les codes d'exemple (Joystick), tu verras qu'ils utilisent le context pour éviter d'appeler [binding isEqualToString:] à chaque notification KVO.
Par ailleurs dans la méthode -[bind...], il ne faut pas écrire
[tt]if (binding == @pathToPicture)[/tt]
mais
[tt]if ([binding isEqualToString:@pathToPicture])[/tt]
Merci pour le lien, je suis tombé dessus assez souvent lors de mes recherches, il est vraimant utile.
Si tu as des questions, tu peux toujours me les poser, il y a un moment, je me tâtais même à écrire un livre au sujet des bindings (et puis comme d'habitude, le manque de temps).
Mon problème était d'avoir un équivalent aux NSFetchedResultsController : avoir un NSArray d'objets Core Data, avec notifications automatique en cas de changement du contenu, sans utiliser de binding dans un XIB.
Au final, parce que je n'ai pas le temps de chercher comment ça fonctionne, j'ai commencé à partir sur des notifications à l'ancienne, avec le notification center.