Popup et bindings
muqaddar
Administrateur
Salut,
Je dois binder le contenu d'un popup sur le contenu d'un ArrayController (pas de pb sous IB ou "on the fly") mais je dois cumuler en plus une entrée dans la liste, là ça se corse...
Je pourrai ajouter une entrée en plus ds le dictionnaire qui alimente le tableau, mais il ne faut qu'il soit vu dans ce tableau mais uniquement dans la liste.
J'ai aussi essayé avec addItemWithTitle sans succès.
[websitesPopup addItemWithTitle : @No dedicated server];
[websitesPopup bind: @contentValues toObject: serversController withKeyPath:@arrangedObjects options: nil];
Merci de m'éclairer.
Je dois binder le contenu d'un popup sur le contenu d'un ArrayController (pas de pb sous IB ou "on the fly") mais je dois cumuler en plus une entrée dans la liste, là ça se corse...
Je pourrai ajouter une entrée en plus ds le dictionnaire qui alimente le tableau, mais il ne faut qu'il soit vu dans ce tableau mais uniquement dans la liste.
J'ai aussi essayé avec addItemWithTitle sans succès.
[websitesPopup addItemWithTitle : @No dedicated server];
[websitesPopup bind: @contentValues toObject: serversController withKeyPath:@arrangedObjects options: nil];
Merci de m'éclairer.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Tu veux ajouter au popUp une ligne @No dedicated server sans ajouter cette ligne dans "l'Array-source" ? c'est ça ?
C'est alors d'un Place Holder dont tu sembles avoir besoin, pour gérer l'absence de choix d'un serveur dans ton PopUp.
Bindes alors le "content" du popUp à la volée sur ton "l'Array-source" avec comme option:
ça semble marcher, seulement quand je vais sur les autres enregistrements, ça les sélectionne pas, ça reste sur le NSNullPlaceHolder... Par ailleurs si tu pouvais (ou un autre) m'expliquer la différence entre NSNullPlaceholder et NSInsertsNullPlaceholder ?
merci
En revanche, impossible de binder "enable" sur un booléen ?
Salut Osxitan
Le NSNullPlaceHolder est utilisé lorsqu'un binding retourne une valeur nulle.
Ici donc tu spécifies ton place holder avec:
Pour les PopUp tu peux demander aussi d'insérer l' "item Null" qui va afficher le dit NullPlaceHolder et permettre à l'utilisateur de le choisir explicitement au moyen du popUp.
ici tu dit, affiche carrément un item de plus qui affichera le nullPlaceHolder:
(YES, je veux l'item null dans mon cher popUp)
Si tu as défini comme ici un place Holder perso dans les options, il sera alors utilisé ici, sinon c'est un NullPlaceHolder par défault (en anglais) qui sera défini (@no value je crois). 8)
Je confirme.
En revanche, je patine sur l'enable du popup qui semble ne pas vouloir de BOOL ?
C'est pas un BOOL en effet qu'il veut mais un NSNumber contenant une valeur boléenne
- (id)transformedValue:(id)etat
{
switch ([etat intValue]) {
case NSOnState:
return [NSNumber numberWithBool: YES];
break;
case NSOffState:
return [NSNumber numberWithBool: NO];
break;
}
}
? à la différence de editable ?
2004-09-16 14:12:59.844 webmasterMemory[2814] Cannot create BOOL from object <_NSControllerObjectProxy: 0x3648d0> of class _NSControllerObjectProxy
2004-09-16 14:12:59.849 webmasterMemory[2814] *** Uncaught exception: <NSInternalInconsistencyException> Cannot create BOOL from object <_NSControllerObjectProxy: 0x3648d0> of class _NSControllerObjectProxy
Tu devrais inclure à ton transformer la gestion des erreurs dues à des valeurs non attendues
Pas au NSTextfield ni au NSPopUp ! Non ?
Essaies néanmoins de rajouter un case pour les autres valeurs voire même de mettre un NSLog dans les différents cas, ou mieux de mettre un point d'arret dans le transformer pour lire la valeur qui lui a été transmise.
Oui le binding sur la propriété enabled d'un popUp attends bien un NSNumber contenant un Boléen. Pour s'en assurer tu peux aller sous I.B. et voir que les transformers dispo pour ce bindings renvoient tous un booléen (NSIsNotNil, NSIsNil, NSNegateBoolean).
Bizard bizard
j'ai dit bizard moi ?
tiens, comme c'est bizard ...
Vérifie ne débuggage ce qu'il se passe dans ton transformer car ton message d'erreur ne dit pas qu'il ne veut pas d'un BOOL mais qu'il ne peut créer de Bool à partir de ce qu'il reçoit.
Il est fort possible que ton transformer ne fonctionne pas comme attendu ... En particulier, ton transformer ne renvoie rien du tout si aucun des 2 cases n'est conforme à ce qu'il reçoit.
Je sais pas pourquoi il ne recevrait pas NSOnState ou NSOffState mais on comprendrait mieux si on vérifiait ...
- (id)transformedValue:(id)etat
{
NSLog("valeur de etat : %i", [etat intValue]);
switch ([etat intValue]) {
case NSOnState:
return [NSNumber numberWithBool: YES];
break;
case NSOffState:
return [NSNumber numberWithBool: NO];
break;
}
}
ça c'est normal tu as oublié le @ magique devant le "
Essies ton simplement ça
Si ton popUp n'a pas d'item il restera désactivé.
Essaies de débinder le "contentValues" et laisse le avec le contenu (item1, item2, item3) défini sous I.B. pour voir si par hasard c'est pat le binding du contenu qui fait tout foirer ???
A l'origine, nous récupérions un int "websiteEditable", que le transformer analysait, pui renvoyait un NSNumber BOOL.
Et bien en changeant ce int de base en NSNumber ça marche :
NSNumber *websiteEditable;
Puis ds le transformer :
switch ([etat boolValue]) {
case NSOnState:
return [NSNumber numberWithBool: YES];
break;
case NSOffState:
return [NSNumber numberWithBool: NO];
break;
}
Ce que je ne saisis pas, c'ets que "etat boolValue" puisse être NSOnState ou NSOffState (tout comme le int d'ailleurs)... ça drrvait pas être YES ou NO ???
la variable NSNumber *websiteEditable qui sert de valueKeyPath semble suffisante pour binder le bouton edition, ensuite binder editable ou enabled sur cette variable, et ça semble suffir !!!
La BoolValue d'un NSNumber à 0 est False
La BoolValue d'un NSNumber AUTRE QUE zéro est VRAI.
j'ai bien dit autre que zéro, pas uniquement 1, ce qui veut dire que NSMixedState donnera ausi VRAI ce qui n'est pas forcément adapté.
De plus les valeurs de NSOnState et NSOffState ne sont pas garanties. Si à l'avenir Apple change la valeur de ces constantes, seules les références au constantes NSOnState et NSOffState permettront à ton code de s'y retrouver.
Sinon, dans un autre ordre d'idée, j'ai essayé de binder l'état enabled d'un bouton sur un NSArray, en selection, avec ValueKeyPath "dicWebsites.name", et No Selection placeholder à "No". Et bien l'enable marche à l'envers... J'ai mis "Yes" ensuite, mais c'est pareil.
Le but étant de rendre le bouton cliquable uniquement qd un enregsitrement est sélectionné ds le NSArray...
Pour ça c'est simple
Tu bindes le bouton à la "selectedObjects" de ton ArrayController et tu choisi le transformer NSIsNotNil.
Le bouton ne sera actif que si une ligne au moins est sélectionnée.
Tu peux aussi choisir de ne le désactiver que si un champs donné n'est pas renseigné alors tu bindes sur "selection.laClefsDuChamp" avec le même transformer.
Le bouton ne sera clicable que si le bon champs est renseigné sur la ligne sélectionnée.
P.S. Ne te serts pas des placeHolders pour ça
ça marche avec Selection et non selectedObjects ;-)
Merci.
ça marche pas avec avec le control key à "arangedObjects" en laissant le Model Key Path en blanc ? ???
ben oui c'est logique que s'il n'y a pas de sélection, y'a pas de selected obects dons si t'as mis le NSIsNotNilTransformer ça renvoie faux et ton bouton est désactivé.
Mais s'il y a une ou plusieurs lignes sélectionnées, selected objects n'est pas nil et ton bouton est activé.
[EDIT] je viens de tester chez moi et ça marche ;D