71 votes

UIMenuController ne se présente pas

J'essaie de créer un UIMenuController personnalisé et de l'afficher dans ma vue. Voici mon code:

 UIMenuController *menuController = [UIMenuController sharedMenuController];
    UIMenuItem *listMenuItem = [[UIMenuItem alloc] initWithTitle:@"List" action:@selector(addList:)];

    [menuController setMenuItems:[NSArray arrayWithObject:listMenuItem]];
    [menuController setTargetRect:CGRectMake(50.0, 50.0, 0, 0) inView:self.view];
    [menuController setMenuVisible:YES animated:YES];

    [listMenuItem release];
 

Il n'y a pas d'erreur ni d'exception, mais le contrôleur de menu ne s'affiche tout simplement pas.

182voto

OZ Apps Points 876

Ce que vous devez faire trois choses:

  1. Vous devez appeler -becomeFirstResponder de la vue ou de-vue-contrôleur.
  2. Votre point de vue ou vue contrôleur doit mettre en oeuvre -canBecomeFirstResponder (de retour YES).
  3. En option, votre point de vue ou vue contrôleur peut mettre en oeuvre -canPerformAction:action withSender:sender pour afficher/cacher des éléments de menu sur une base individuelle.

25voto

Kalle Points 6804

La réponse mentionne trois choses, mais pour être pointilleux, il y en a six:

  1. Le gestionnaire de menu doit être une UIView. Si elle n'est pas, -becomeFirstResponder d'échec.
  2. Le gestionnaire de menu doit avoir userInteractionEnabled = YES
  3. Le gestionnaire de menu doit être dans le point de vue de la hiérarchie et de ses -window de la propriété doit être la même que la fenêtre de la vue dans l' inView: argument.
  4. Vous avez besoin de mettre en oeuvre -canBecomeFirstResponder et retour YES.
  5. Vous devez appeler [handler becomeFirstResponder], avant d' [menu setTargetRect:inView:] est appelé, ou celui-ci sera un échec.
  6. Vous devez appeler [menu setTargetRect:inView] (au moins une fois) et [menu setMenuVisible:animated:].

En particulier les points 1 à 3 ci-dessus m'a eu. Je voulais un menu personnalisé gestionnaire de classe qui a un UIResponder au premier, qui a causé -becomeFirstResponder de rendement NO; alors que c'était un UIView, qui a échoué, alors j'ai essayé de faire un UIButton qui ont travaillé, mais seulement parce qu' userInteractionEnabled par défaut est YES pour les boutons et NO pour UIViews.

15voto

Snehal Points 432

UIMenuController est visible sur une vue que si la vue est le premier intervenant et

- (BOOL)canPerformAction méthode renvoie YES

Donc, si votre menu est un contrôleur à être montré sur le bouton cliquez sur la première ligne dans le bouton de action devrait être [self becomeFirstResponder]. REMARQUE: ici, l'auto est le point de vue qui va présenter les menus.

Si vos menus doivent être affichés sur le long appuyez sur le geste, puis ajouter longPressGesture à l' UIView et dans la appuyez de manière prolongée sur l'événement avant d'écrire

[menuController setTargetRect:CGRectMake(50.0, 50.0, 0, 0) inView:self.view];
[menuController setMenuVisible:YES animated:YES];

écrire [self becomeFirstResponder];

Puis suivez les étapes mentionnées par OZ.

8voto

HDA Points 2590

Ci-dessous est un complet commenté exemple de travail ...

Vue sous-classe fichier d'en-tête

#import <Foundation/Foundation.h>

@interface MenuControllerSupportingView : UIView
{

}
@end

Vue sous-classe fichier source

#import "MenuControllerSupportingView.h"

@implementation MenuControllerSupportingView

//It's mandatory and it has to return YES then only u can show menu items..
-(BOOL)canBecomeFirstResponder
{
  return YES;
}

-(void)MenuItemAClicked
{
  NSLog(@"Menu item A clicked");
}

-(void)MenuItemBClicked
{
 NSLog(@"Menu item B clicked");
}

-(void)MenuItemCClicked
{
  NSLog(@"Menu item C clicked");
}

//It's not mandatory for custom menu items

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{  
  if(action == @selector(MenuItemAClicked))
     return YES;
  else if(action == @selector(MenuItemBClicked))
    return YES;
  else if(action == @selector(MenuItemCClicked))
    return YES;
  else
    return NO;
}

- vue-Contrôleur fichier d'en-tête

#import <UIKit/UIKit.h>

@interface ViewController1 : UIViewController

@end

- vue-Contrôleur fichier source

 #import "ViewController1.h"
 #import "MenuControllerSupportingView.h"

@interface ViewController1 ()
{
 MenuControllerSupportingView *vu;
}
@end

@implementation ViewController1

 - (void)viewDidLoad
{
  [super viewDidLoad];

  vu=[[SGGI_MenuControllerSupportingView alloc]initWithFrame:CGRectMake(0,0,768,1024)];

[self.view addSubview:vu];

 UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];

 [btn setFrame:CGRectMake(200,200,200,30)];

 [btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];

 [btn setTitle:@"Show" forState:UIControlStateNormal];

 [btn addTarget:self action:@selector(SHowMenu) forControlEvents:UIControlEventTouchUpInside];

 [vu addSubview:btn];

}

-(void)SHowMenu
{
 UIMenuController *menucontroller=[UIMenuController sharedMenuController];

UIMenuItem *MenuitemA=[[UIMenuItem alloc] initWithTitle:@"A" action:@selector(MenuItemAClicked)];

UIMenuItem *MenuitemB=[[UIMenuItem alloc] initWithTitle:@"B" action:@selector(MenuItemBClicked)];

UIMenuItem *MenuitemC=[[UIMenuItem alloc] initWithTitle:@"C" action:@selector(MenuItemCClicked)];

[menucontroller setMenuItems:[NSArray arrayWithObjects:MenuitemA,MenuitemB,MenuitemC,nil]];

    //It's mandatory
[vu becomeFirstResponder];

    //It's also mandatory ...remeber we've added a mehod on view class
if([vu canBecomeFirstResponder])
{

    [menucontroller setTargetRect:CGRectMake(10,10, 0, 200) inView:vu];

    [menucontroller setMenuVisible:YES animated:YES];
}

}




-(void)didReceiveMemoryWarning
{
  [super didReceiveMemoryWarning];

}

@end

En Vue de classe si u écrivez retour OUI seul dans canPerformAction vous pourrez voir tous les défaut menuitems comme symbole de la caméra,couper,copier, etc..

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
 return YES;
}

si tu veux montrer quelque chose comme seule caméra puis

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if(action==@selector(_insertImage:))
     return YES;
else
     return NO;

}

si tu veux connaître toutes les actions, puis

visitez le lien

2voto

MattLeff Points 882

Juste au cas où quelqu'un aurait ce problème spécifiquement (et de manière aléatoire) avec iOS6: vous voudrez peut-être examiner ce SO pour relier l'activation de Speak Selection à l'appareil (Paramètres -> Général -> Accessibilité -> Speak Selection: On). Un petit nombre de mes utilisateurs ne pouvaient pas voir la coutume UIMenuItems et c'était la cause.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X