[TRUKéASTUCE] Menu avec une plist

fouffouf Membre
Quand on a un menu avec un grand nombre d'items qui pointent vers le meme selecteur, il est souvent plus pratique de creer une plist puis de creer un menu avec celle-ci. Cela a en plus l'avantage de pouvoir modifier le menu sans toucher du tout au code.

Voila le code pour creer un menu avec un NSArray, une cible et un selecteur :

<br />- (NSMenu*) initMenuWithArray:(NSArray *)array target:(id)aTarget selector:(SEL)selector<br />{<br />	NSMenu *menu;<br />	int i;<br />	//NSMenuItem *item;<br />	menu = [[[NSMenu alloc] init]autorelease];<br />	for(i = 0;i&lt;[array count];i++){<br />		<br />		NSString *title = [array objectAtIndex:i];<br />		NSMenuItem *item = [[NSMenuItem alloc] init];<br />		[item setTitle:title];<br />		if (aTarget != nil){<br />		[item setTarget:aTarget];<br />		}<br />		<br />		if (selector != NULL){<br />		[item setAction:selector];<br />		}<br />		[item setKeyEquivalent:@&quot;&quot;];<br />		<br />		[menu addItem:item];<br />		<br />		[item release]; //item is retained by menu<br />	}<br /><br />	return menu;<br />}<br />


(faites juste attention avec la gestion memoire : j'ai mis un autorelease, jsais pas si c'est tres bien  ???)

Vos sugestions pour ameliorer le code ?? Je suis ouvert a toutes les propositions.

Réponses

  • cbrandtcbrandt Membre
    02:09 modifié #2
    je suppose que tu as surchargé NSMenu ou ajouté une catégorie ?
    donc il faut appeler le "designated initializer" de la classe NSMenu, avec [super initWithTitle: title] si c'est une sous-classe, ou [self initWithTitle: title] si c'est une catégorie.
    en outre, plutôt que d'allouer une nouvelle instance de NSMenu, tu as self qui est déjà  là ...

    on pourrait modifier comme suit:

    <br />- (NSMenu*) initMenuWithArray:(NSArray *)array target:(id)aTarget selector:(SEL)selector<br />{<br />	int i;<br /><br />       if (!(self = [self initWithTitle: titreDuMenu]))<br />               return nil;<br /><br />	//NSMenuItem *item;<br />	for(i = 0;i&lt;[array count];i++){<br />		<br />		NSString *title = [array objectAtIndex:i];<br />		NSMenuItem *item = [[NSMenuItem alloc] init];<br />		[item setTitle:title];<br />		if (aTarget != nil){<br />		[item setTarget:aTarget];<br />		}<br />		<br />		if (selector != NULL){<br />		[item setAction:selector];<br />		}<br />		[item setKeyEquivalent:@&quot;&quot;];<br />		<br />		[self addItem:item];<br />		<br />		[item release]; //item is retained by menu<br />	}<br /><br />	return self;<br />}<br />
    


    et puis on pourrait ajouter le titre dans les paramètres, et aussi renommer initMenuWithArray... en initWithArray... (si on veut vraiment pinailler)

    par contre, si c'est une méthode destinée à  être ajoutée dans un contrôleur, ton code est ok, mais appelle la plutôt makeMenuWithArray, ou quelque chose comme ça...
  • fouffouf Membre
    02:09 modifié #3
    Merci beaucoup cbrant.

    dans 1106867527:

    et puis on pourrait ajouter le titre dans les paramètres,

    d
    D'accord, mais je trouve que ca fait beaucoup de parametres alors qu'il suffit juste de rajouter [menu setTitle:titre];

    dans 1106867527:

    et aussi renommer initMenuWithArray... en initWithArray... (si on veut vraiment pinailler)

    J'ai fait  ;), c'est mieux
  • wiskywisky Membre
    02:09 modifié #4
    NSString *title = [array objectAtIndex:i];<br />		NSMenuItem *item = [[NSMenuItem alloc] init];
    

    Tu risque d'avoir une erreur de redéfinition de variable dans ta boucle. ;)
  • fouffouf Membre
    02:09 modifié #5
    Euh... je vois pas pourquoi ?
    C'est vrai que ca ferait plus propre de mettre les NSMenuItem *item en dehors de la boucle, mais j'ai une excuse :P : j'ai fait ce code il ya un an a peu près, alors que je commencais juste en Cocoa ;)
Connectez-vous ou Inscrivez-vous pour répondre.