Barre d'outils et validation des items
muqaddar
Administrateur
Salut la compagnie créole, :P
Aujourd'hui, jouons avec les barres d'outils et la validation des élements.
1) Cette action sert à valider un icone de la barre d'outils, c.a.d activer ou pas l'icone :
C'est cool, mais dites-moi (surtout les binders), comment puis-je vérifier la sélection d'un élement sans faire encore un outlet sur ma table (ici toto) ?
2) Ensuite, on appelle une fonction comme ça en cliquant un icone avec les barres d'outils :
Pour une fonction définie en dur dans le code, pas de problème, mais pour l'action toute faite "add:" des bindings comment procéder ?
J'ai essayé ça sans succès :
3) Est-ce qu'il est déjà arrivé à quelqu'un ici d'avoir des icônes floues et basse def ds la barre d'outils ? Moi j'en ai 1 sur 2. Incompréhensible. Ce sont des images Tiff (avec calques), j'ai essayé sans calque j'ai le même résultat... :why?:
Aujourd'hui, jouons avec les barres d'outils et la validation des élements.
1) Cette action sert à valider un icone de la barre d'outils, c.a.d activer ou pas l'icone :
- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem<br />{<br /> if ( [theItem action] == @selector(removeGroup:) )<br /> return [toto numberOfSelectedRows] > 0;<br />}
C'est cool, mais dites-moi (surtout les binders), comment puis-je vérifier la sélection d'un élement sans faire encore un outlet sur ma table (ici toto) ?
2) Ensuite, on appelle une fonction comme ça en cliquant un icone avec les barres d'outils :
[item setAction:@selector(addWebsite:)];
Pour une fonction définie en dur dans le code, pas de problème, mais pour l'action toute faite "add:" des bindings comment procéder ?
J'ai essayé ça sans succès :
[item setAction:@selector([groupsController add: _groups])];
3) Est-ce qu'il est déjà arrivé à quelqu'un ici d'avoir des icônes floues et basse def ds la barre d'outils ? Moi j'en ai 1 sur 2. Incompréhensible. Ce sont des images Tiff (avec calques), j'ai essayé sans calque j'ai le même résultat... :why?:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
puis :
ça marche. Je ne sais pas si c'est le plus pratique en revanche.
ça marche pas ?
Et ça évite donc de créer 4 outlets en plus. Niveau code, ça revient au même.
Merci Jeunot !
Reste que tout ça marche à moitié !
Déjà quand je lance l'appli toutes les icones sont "On". Si je ne sélectionne pas d'éléments ds mes groupes, l'icône removeGroup n'est pas active OK. Si je sélectionne un site, l'icône RemoveServer est quand même sélectionnée... (( Bref, ça marche à moitié.
Peut-être un pb de firstResponder qd je lance le soft ?
J'ai pas bien saisi, si tu sélectionnes un site, RemoveServer devrait être désactivée même si un serveur est sélectionné ?
Au passage, tu devrais peut être éviter les if else if ... imbriqués.
Vu le nombre des possibilités un case serait sans doute plus efficient et surtout plus lisible
Tu peux même condenser la ligne return (que j'avais développée en 2 lignes par soucis de clarté) avec un:
Oui, tu as bien saisi, remove server devrait être déselctionné même si je sélectionne un site ! ET ce n'est pas le cas.
en effet
Mais c'est pas ce que tu lui demandes.
Tu lui demande d'être acif si un serveur est sélectionné sans lui préciser de se désactiver si un site est sélectionné.
Ajoutes (0 == [[sitesController selectedObjects] count]) à tes conditions pour le removeServer alors, non ?
Je pensais que la condition qui renvoie YES implique que toutes les autres sont NO...
Tiré d'un tutorial de PO :
http://www.projectomega.org/article.php?lg=fr&php=oreilly_cocoa20&p=3
"Si vous avez plusieurs éléments de barre d'outils ayant le même destinataire mais invoquant différentes actions, il est alors impératif que vous testiez, d'une façon ou d'une autre, que l'élément est l'élément de la barre d'outils que nous voulons valider avant de considérer que la validation est correcte. Un bon moyen de le faire est de comparer l'action de l'élément à la méthode que nous voulons valider. C'est tout à fait logique puisque ce que nous voulons vraiment faire c'est activer ou désactiver un comportement plutôt qu'un élément.
Dans ce cas, nous avons vérifié si l'action de l'élément en question était la méthode deleteRecord:. Si c'est le cas, nous vérifions alors combien de lignes sont sélectionnées. Si une ou plus sont sélectionnées, alors YES est retourné, sinon, NO. Et c'est comme cela que fonctionne la validation d'élément de barre d'outils."
Non ?
mais tout dépend du comportement que tu attends :
Si tu veux vraiment que removeGroup ne soit actif QUE si aucun site NI serveur NI host ne sont sélectionnés même si un groupe est sélectionné alors oui c'est ce qu'il te faut.
Là y'a que toi qui peut décider le comportement adéquat.
Mais pourquoi interdire le retrait d'un groupe si un serveur est aussi sélectionné ? ???
J'imagine que pour toi ça a un sens
tu veux dire:
ou
non ?
la méthode add d'un controller prend comme argument le "sender". Elle crée un nouvel objet puis elle appèle addObject avec comme argument le nouvel objet créé (et pas l'argument de add).
la méthode addObject, elle prend comme argument l'objet à ajouter.
Non, non je faisais juste des tests rapidos j'ai pas approfondi le comportement que j'attends exactement mais je vais m'y atteler très bientôt. Merci.
-(void)addGroup {
[groupsController add: self];
}
ou
-(void)addGroup {
[groupsController add: _groups];
}
Par ailleurs, je n'ai pas saisi ton explication / addObject...
Et comme toutes méthodes action elle ne prend qu'un seul argument: (id) sender.
Et comme beaucoup l'action, elle ne fait rien de son argument "sender".
Elle se contente de créer un objet et d'appeler la méthode addObject: avec le nouvel objet créé comme argument.
Ce qui explique que tes 2 versions fonctionnent en fait.
t'aurais donc aussi pu écrire:
-(void)addGroup {
    [groupsController add: le_Pape];
}
que le résultat serait le même.
Néanmoins la sacrosainte documentation Apple nous précisant que l'argument doit être le sender, et le sender étant ici l'instance pointée par self, [groupsController add: self] est plus conforme aux spécification d'Apple qu'autre chose.
Ouf, je finissait par m'enméler un peu sur la fin, j'étais plus clair là ?
Ouais moi aussi j'ai des truc bizards avec un Tiff qui s'affiche chaque fois sans cheveux sur le forum ;D ;D :P >:D
ok, je sors ... ::)
Hasta luego ClicCool.
Tu suis un code du genre :
if (condition)
{ return }
if (condition)
{ return }
if (condition)
{ return }
etc....
Ca marche aussi bien....
Tout baigne maintenant. Joie.
Le plus efficient est effectivement de mettre des return. Dans le cas des else if, il est obligé d'évaluer la condition qu'il y a derrière un else if. Si tu en as beaucoup c'est du coup plus lourd. Et tout à la fin, tu mets simplement return NO; comme "sécurité".
T'inquiète, je t'attends à la sortie ! :boss):
Merci à vous ! :-)
1) Je voulais que le mode des icônes par défaut soit small , j'ai donc écrit :
[toolbar setSizeMode: NSToolbarSizeModeSmall];
sans succès... (à l'initialisation de ma toolbar).
2) Et je voudrais aussi annuler la possibilité de mettre des grandes icônes qd on cutsomize la barre (la checkbox) et là je sais pas comment faire ça...
essaie de supprimer ou de regarder dans ton fichier de préférences, car si tu as utilisé [toolbar setAutosavesConfiguration: YES], l'état "icônes grande taille" a été mémorisé dans le fichier de prefs...
[toolbar setAutosavesConfiguration:YES];
[toolbar setSizeMode: NSToolbarSizeModeSmall];
?
par exemple j'ai ça dans un projet:
  NSToolbar *toolbar = [[[NSToolbar alloc] initWithIdentifier: @toolbar] autorelease];
 Â
  [toolbar setAllowsUserCustomization: YES];
  [toolbar setAutosavesConfiguration: YES];
  [toolbar setDisplayMode: NSToolbarDisplayModeIconAndLabel];
  [toolbar setDelegate: self];
 Â
  [[self window] setToolbar: toolbar];
eh ben le setDisplayMode: est ignoré car le setAutosavesConfiguration: est à YES... (sauf bien sûr si le fichier de prefs n'existe pas ou si la clé NSToolbar Configuration toolbar est manquante)
dans MyToolbar.h:
#import <Cocoa/Cocoa.h>
@interface MyToolbar : NSToolbar {}
@end
et dans MyToolbar.m:
#import "MyToolbar.h"
@implementation MyToolbar
- (void) setSizeMode: (NSToolbarSizeMode) sizeMode
{
[super setSizeMode: NSToolbarSizeModeSmall];
}
@end
bien sûr, il faut appeler NSToolbar *toolbar = [[[MyToolbar alloc] initWithIdentifier ... au lieu de NSToolbar, et rajouter #import "MyToolbar.h" dans le window controller...