Bug icones désactivées

muqaddarmuqaddar Administrateur
10:24 modifié dans API AppKit #1
Salut,

J'ai un petit soucis sur une toolbar (j'en ai 2), les icones sont désactivées alors que je les ai bien activées.

//activation des icones
- (BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem
{
if (([[toolbarItem itemIdentifier] isEqualToString:@GeneralItem]) ||
([[toolbarItem itemIdentifier] isEqualToString:@PaysItem])) {
return YES;
    }
}

bizarre, bizarre, je sèche, et je cherche à  savoir si ça peut venir d'une interférence avec mon autre toolbar, celle de l'appli.

++

Réponses

  • cbrandtcbrandt Membre
    10:24 modifié #2
    il peut y avoir plusieurs raisons:
    - faute de frappe dans l'ID de l'item (c'est pourquoi je définis toujours une constant avec #define)
    - l'action ou la target sont érronés
    - ...

    si les deux toolbars ont un identifiant différent, y'a pas de pb. par contre si elles ont le même delegate, il vaut peut-être mieux tester la toolbar concernée, surtout si des items ont le même identifiant dans les 2 toolbars ?
    (euh, je ne sais pas si je suis très clair, là  :)

    ps: manque un 'return NO' juste avant la fin de la fonction ;)
  • muqaddarmuqaddar Administrateur
    10:24 modifié #3
    Les 2 toolbars ont bien un identifiants différents, ce sont 2 catégories de 2 classes controlleurs différentes : main et préférences.

    Si ça peut aider :

    <br />//construction de la barre d&#39;outils<br />- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag<br />{<br />    NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier];<br /><br />    if ([itemIdentifier isEqualToString:@&quot;GeneralItem&quot;]) {<br />          [item setLabel:@&quot;Général&quot;];<br />             [item setPaletteLabel:[item label]];<br />              [item setImage:[NSImage imageNamed:@&quot;General&quot;]];<br />                [item setTarget:self];<br />            [item setAction:@selector(selectGeneralView:)];<br />    }<br />    else if ([itemIdentifier isEqualToString:@&quot;PaysItem&quot;]) {<br />            [item setLabel:@&quot;Pays&quot;];<br />                [item setPaletteLabel:[item label]];<br />              [item setImage:[NSImage imageNamed:@&quot;Pays&quot;]];<br />           [item setTarget:self];<br />            [item setAction:@selector(selectPaysView:)];<br />    }<br /><br />    return [item autorelease];<br />}<br />
    


    Quand je lance la fenêtre prefs, elles sont d'abord activées et 1/4 sec après désactivées...
  • cbrandtcbrandt Membre
    10:24 modifié #4
    hum... ça a l'air normal tout ça...
    essaye d'insérer NSLog (@item: %@", [toolbarItem itemIdentifier]) dans validateToolbarItem pour vérifier qu'il passe bien par là  et afficher ce qu'il reçoit...
  • muqaddarmuqaddar Administrateur
    10:24 modifié #5
    Il n'affiche rien. :(
    J'ai testé dans l'autre toolbar qui affiche bien le nom des items.

    Curieux, il ne rentre pas dans cette méthode on dirait.
  • cbrandtcbrandt Membre
    10:24 modifié #6
    - (BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem
    et
    - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag
    sont bien dans la même classe ?
    et si tu postait tout le contenu de ta classe ? (.h et .m)
  • muqaddarmuqaddar Administrateur
    10:24 modifié #7
    Oui.

    #import &lt;Cocoa/Cocoa.h&gt;<br />#import &quot;PrefsController.h&quot;<br /><br />#define PaysItem @&quot;PaysItem&quot;<br />#define GeneralItem @&quot;GeneralItem&quot;<br /><br />@interface PrefsController (PrefsToolbarCategory)<br /><br />- (void)setupPrefsToolbar;<br />- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar<br />&nbsp; &nbsp; itemForItemIdentifier:(NSString *)itemIdentifier<br />&nbsp; &nbsp; willBeInsertedIntoToolbar:(BOOL)flag;<br />- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar;<br />- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar;<br />- (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar;<br /><br />@end
    


    #import &quot;PrefsToolbarCategory.h&quot;<br /><br />@implementation PrefsController (PrefsToolbarCategory)<br /><br /><br />//=====================//<br />//GESTION DE LA TOOLBAR//<br />//=====================//<br /><br />//configuration de la toolbar<br />- (void)setupPrefsToolbar<br />{<br />&nbsp; &nbsp; NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier:@&quot;prefsToolbar&quot;];<br />&nbsp; &nbsp; [toolbar setDelegate:self];<br />&nbsp; &nbsp; [toolbar setAllowsUserCustomization:NO];       <br />&nbsp; &nbsp; [toolbar setAutosavesConfiguration:NO];<br />&nbsp; &nbsp; [toolbar setSelectedItemIdentifier:@&quot;GeneralItem&quot;];<br />&nbsp; &nbsp; [prefsWindow setToolbar:[toolbar autorelease]];<br />}<br /><br />//construction de la barre d&#39;outils<br />- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag<br />{<br />&nbsp; &nbsp; NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier];<br /><br />        if ([itemIdentifier isEqualToString:@&quot;GeneralItem&quot;]) {<br />          [item setLabel:@&quot;Général&quot;];<br />             [item setPaletteLabel:[item label]];<br />              [item setImage:[NSImage imageNamed:@&quot;General&quot;]];<br />                [item setTarget:self];<br />            [item setAction:@selector(selectGeneralView:)];<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; else if ([itemIdentifier isEqualToString:@&quot;PaysItem&quot;]) {<br />                [item setLabel:@&quot;Pays&quot;];<br />                [item setPaletteLabel:[item label]];<br />              [item setImage:[NSImage imageNamed:@&quot;Pays&quot;]];<br />           [item setTarget:self];<br />            [item setAction:@selector(selectPaysView:)];<br />&nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; return [item autorelease];<br />}<br />&nbsp; &nbsp; <br />//elements qui composent la feuille de customization<br />- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar<br />{<br />&nbsp; &nbsp; return [NSArray arrayWithObjects: <br />                                       NSToolbarSeparatorItemIdentifier,<br />                         &nbsp; &nbsp; NSToolbarSpaceItemIdentifier,<br />                               &nbsp; &nbsp; NSToolbarFlexibleSpaceItemIdentifier,<br />                                       NSToolbarCustomizeToolbarItemIdentifier,<br />                          &nbsp; &nbsp; @&quot;GeneralItem&quot;, @&quot;PaysItem&quot;,<br />                                    nil];<br />}<br /><br />//element de barre par defaut au lancement du prog<br />- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar<br />{<br />&nbsp; &nbsp; return [NSArray arrayWithObjects: @&quot;GeneralItem&quot;, @&quot;PaysItem&quot;, nil];<br />}<br /><br />//activation des icones<br />- (BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem<br />{<br />  NSLog (@&quot;item: %@&quot;, [toolbarItem itemIdentifier]);<br />      if (([[toolbarItem itemIdentifier] isEqualToString:@&quot;GeneralItem&quot;]) ||<br />          ([[toolbarItem itemIdentifier] isEqualToString:@&quot;PaysItem&quot;])) {<br />         return YES;<br />&nbsp; &nbsp; }<br />  return NO;<br />}<br /><br />//les surligner<br />- (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar<br />{<br />&nbsp; &nbsp; return [NSArray arrayWithObjects: @&quot;GeneralItem&quot;, @&quot;PaysItem&quot;, nil];<br />}<br /><br /><br />//action sur les icones de la toolbar<br />- (void)selectGeneralView {  <br />}<br /><br />- (void)selectPaysView {     <br />}<br /><br />@end
    
  • cbrandtcbrandt Membre
    10:24 modifié #8
    et voilà ...

    <br />//action sur les icones de la toolbar<br />- (void)selectGeneralView: (id) sender{    <br />}<br /><br />- (void)selectPaysView: (id) sender {      <br />}<br />
    


    ps: maintenant que tu as mis les #define, tu peux remplacer tous les @GeneralItem par GeneralItem dans le .m, parce que si un jour tu fais une faute de frappe dans @GeneralItem, tu ne t'en rendrais pas compte à  la compil'... (et pareil pour PaysItem)
  • muqaddarmuqaddar Administrateur
    10:24 modifié #9
    Euh, c'est moi qui ait envelé le contenu de ces méthodes pour alléger le code dans le forum, mais elles sont bien pleines :

    - (void)selectGeneralView {
    [prefsWindow setContentView: blankView];
    [self resizeWindowToSize: generalSize];
    [prefsWindow setContentView: generalView];
    }

    - (void)selectPaysView {
    [prefsWindow setContentView: blankView];
    [self resizeWindowToSize: paysSize];
    [prefsWindow setContentView: paysView];
    }
  • cbrandtcbrandt Membre
    10:24 modifié #10
    non non, le pb c'est pas qu'elles sont vides, c'est que c'est pas les bonnes:

    tu as oublié ":(id) sender" 
    ;D
  • muqaddarmuqaddar Administrateur
    10:24 modifié #11
    Oups.

    J'avais comparé avec mon autre toolbar (main), et j'avais pas non plus les sender et ça marchait pourtant. Ce que je n'avais pas vu c'est que dans l'appel de la méthode action :

    @selector(selectMainView)

    Je n'avais pas mis les ":" .

    Donc, qu'est-ce qui est le mieux ?

    ça :
    @selector(selectMainView:)
    puis ça :
    - (void)selectMainView: (id) sender

    ou bien ça :
    @selector(selectMainView)
    puis ça :
    - (void)selectMainView

    ? ;-)
  • cbrandtcbrandt Membre
    novembre 2004 modifié #12
    le mieux c'est ça, c'est pour rester dans la logique des IBAction de IB, comme avec les boutons etc...
    dans 1100521601:

    ça :
    @selector(selectMainView:)
    puis ça :
    - (void)selectMainView: (id) sender


    et puis le sender étant l'objet qui a envoyé le message, il peut être utile d'y avoir accès (le toolbaritem dans notre cas)

    [edit]
    YES YES YES !!
    j'ai ma première graine de chocolat !  :) :) :) :)
    [/edit]
  • muqaddarmuqaddar Administrateur
    10:24 modifié #13
    OK, merci pour tout cbrandt.

    Avec la vitesse à  laquelle tu réponds, tu ne vas pas tarder à  avoir plein de cabosses (et non de graines). Et oui, en fait la cabosse contient les fèves de cacao. C'est cool on se cultive (humour) grâce à  Apple.
Connectez-vous ou Inscrivez-vous pour répondre.