Toolbar & setEnabled

chrixtianchrixtian Membre
10:27 modifié dans API AppKit #1
Bonjour tout le monde  :)

J'ai une interrogation concernant la méthode setEnabled de la classe NSToolbarItem. J'ai un item que je veux rendre inactif. Je fais un [monItem setEnabled:NO] et ......... rien :(
L'item est toujours actif et clickable. Existe-t-il une ruse de sioux pour que cela fonctionne ? Ou bien, seul un appel à  setAction:nil sur un toolbaritem peut le désactiver ?

Merci par avance de vos lumières ;)



Réponses

  • Philippe49Philippe49 Membre
    10:27 modifié #2
    La doc de NSToolbaritem dit 

    [size=12pt]setEnabled:[/size]
    Sets the receiver's enabled flag.

    - (void)setEnabled:(BOOL)enabled

    Parameters
    enabled
    YES to enable the receiver, otherwise NO.
    Discussion
    For a custom view item, this method calls setEnabled: on the view if it responds.


    J'ai donc essayé une Toolbar avec une custom view et un NSButton
    Le [item setEnabled:NO] est actif sur le ToolbarItem-bouton, mais pas sur les Toolbar-custom-view.

  • août 2008 modifié #3
    Le plus simple c'est d'utiliser le delegate de NSToolbar qui dit :
    <br />- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem;<br />
    


    Ainsi, en déclarant ça dans notre header et en n'oubliant pas de faire un setDelegate:self pour la toolbar, on utilisera le code comme ci-dessous :

    <br />- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem<br />{<br />&nbsp; &nbsp; if([[theItem itemIdentifier] isEqualTo:TOOLBAR_NEXT])<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return nextAvailable; // Je retourne une valeur booléenne &quot;nextAvailable&quot; qui détermine si oui ou non mon toolbar item peut être cliqué ou pas.<br />&nbsp; &nbsp; <br />}<br />
    

    Tu l'auras compris, TOOLBAR_NEXT est en fait un simple #define qui est en fait le nom donné à  un de mes toolbar items grâce à  initWithItemIdentifier:


    Si je devais te filer un gros pavé pour montrer l'implémentation d'une toolbar avec customization et avec enabled ou non ça donnerait ça :

    AppController.h :
    <br />@interface AppController : NSWindowController{}<br /><br />- (void)setupToolbar;<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 />- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem;<br /><br />@end<br />
    


    AppController.m :
    <br />#import &quot;AppController.h&quot;<br /><br />#define PREVIOUS_ITEM @&quot;Previous&quot;<br />#define NEXT_ITEM&nbsp; &nbsp; &nbsp; &nbsp; @&quot;Next&quot;<br />#define HOME_ITEM&nbsp; &nbsp; &nbsp;  @&quot;Home&quot;<br /><br /><br />@implementation AppController<br /><br />- (void)awakeFromNib<br />{<br />&nbsp; &nbsp; [self setupToolbar];<br />}<br /><br />- (void)setupToolbar<br />{<br />&nbsp; &nbsp; NSToolbar *toolbar = [[NSToolbar alloc] initWithIdentifier:@&quot;MyToolbar&quot;];<br />&nbsp; &nbsp; [toolbar setDelegate:self];<br />&nbsp; &nbsp; [toolbar setAllowsUserCustomization:YES];	<br />&nbsp; &nbsp; [toolbar setDisplayMode:NSToolbarDisplayModeIconOnly];<br />&nbsp; &nbsp; [[self window] setToolbar:[toolbar autorelease]];&nbsp; &nbsp; <br />}<br /><br />- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar<br />&nbsp; &nbsp; itemForItemIdentifier:(NSString *)itemIdentifier<br />&nbsp; &nbsp; willBeInsertedIntoToolbar:(BOOL)flag<br />{<br />&nbsp; &nbsp; NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier];<br />&nbsp; &nbsp; <br />&nbsp;  if ( [itemIdentifier isEqualToString: HOME_ITEM] ) {<br />	[item setLabel: HOME_ITEM];<br />	[item setPaletteLabel:[item label]];<br />	[item setImage:[NSImage imageNamed:@&quot;Home&quot;]];<br />	[item setTarget:self];<br />	[item setAction:@selector(home:)];<br />&nbsp; &nbsp; }else if ( [itemIdentifier isEqualToString: NEXT_ITEM] ) {<br />	[item setLabel: NEXT_ITEM];<br />	[item setPaletteLabel:[item label]];<br />	[item setImage:[NSImage imageNamed:@&quot;Next&quot;]];<br />	[item setTarget:self];<br />	[item setAction:@selector(next:)];<br />&nbsp; &nbsp; }else if ( [itemIdentifier isEqualToString: PREVIOUS_ITEM] ) {<br />	[item setLabel: PREVIOUS_ITEM];<br />	[item setPaletteLabel:[item label]];<br />	[item setImage:[NSImage imageNamed:@&quot;Next&quot;]];<br />	[item setTarget:self];<br />	[item setAction:@selector(next:)];<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return [item autorelease];<br />}<br /><br />- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar<br />{<br />&nbsp; &nbsp; return [NSArray arrayWithObjects:HOME_ITEM, PREVIOUS_ITEM, NEXT_ITEM,nil];<br />}<br /><br />- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar<br />{<br />&nbsp; &nbsp;  return [NSArray arrayWithObjects:HOME_ITEM, PREVIOUS_ITEM, NEXT_ITEM,nil];<br />}<br /><br />- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem<br />{<br />&nbsp; &nbsp; if([[theItem itemIdentifier] isEqualTo:NEXT_BUTTON])<br />&nbsp; &nbsp; &nbsp; &nbsp;  return nextAvailable;<br />&nbsp; &nbsp; else if([[theItem itemIdentifier] isEqualTo:PREVIOUS_BUTTON])<br />&nbsp; &nbsp; &nbsp; &nbsp;  return previousAvailable;<br /><br />&nbsp; &nbsp; return YES;<br />}<br />@end<br />
    
  • Philippe49Philippe49 Membre
    10:27 modifié #4
    Oh là , Eaglelouk, tu donnes là  l'ancienne version pour installer une Toolbar.
    Avec IB 3, c'est beaucoup plus simple : voir ici
  • 10:27 modifié #5
    dans 1219093092:

    Oh là , Eaglelouk, tu donnes là  l'ancienne version pour installer une Toolbar.
    Avec IB 3, c'est beaucoup plus simple : voir ici

    Je sais :) mais on sait jamais il n'indique pas si il est sous Léopard ou pas !
    De toute façon l'essentiel c'est la méthode delegate ^^
Connectez-vous ou Inscrivez-vous pour répondre.