Je n'ai pas pu le faire fonctionner même quand je lis toutes vos réponses. Je présente un code prêt qui fonctionnera pour tout le monde.
Disons que nous avons une classe de contrôleur appelée Controller. Vous pouvez simplement coller le code suivant à ce contrôleur pour avoir le menu de travail sur son point de vue:
- (void)loadView {
[super loadView];
UILongPressGestureRecognizer *gr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
[self.view addGestureRecognizer:gr];
}
- (void) longPress:(UILongPressGestureRecognizer *) gestureRecognizer {
if ([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
CGPoint location = [gestureRecognizer locationInView:[gestureRecognizer view]];
UIMenuController *menuController = [UIMenuController sharedMenuController];
UIMenuItem *resetMenuItem = [[UIMenuItem alloc] initWithTitle:@"Item" action:@selector(menuItemClicked:)];
NSAssert([self becomeFirstResponder], @"Sorry, UIMenuController will not work with %@ since it cannot become first responder", self);
[menuController setMenuItems:[NSArray arrayWithObject:resetMenuItem]];
[menuController setTargetRect:CGRectMake(location.x, location.y, 0.0f, 0.0f) inView:[gestureRecognizer view]];
[menuController setMenuVisible:YES animated:YES];
}
}
- (void) copy:(id) sender {
// called when copy clicked in menu
}
- (void) menuItemClicked:(id) sender {
// called when Item clicked in menu
}
- (BOOL) canPerformAction:(SEL)selector withSender:(id) sender {
if (selector == @selector(menuItemClicked:) || selector == @selector(copy:)) {
return YES;
}
return NO;
}
- (BOOL) canBecomeFirstResponder {
return YES;
}
Ce qui doit être fait pour que le menu de travail est que le firstResponder (dans notre cas, notre contrôleur - voir la ligne avec [auto becomeFirstResponder]) doit être en mesure de devenir le premier répondeur (méthode remplacement canBecomeFirstResponder la cause implémentation par défaut retourne NO), ainsi que - (BOOL) canPerformAction:(SEL)selector withSender:(id) sender
qui devrait revenir OUI à toute action qui peut être effectuée par firstResponder
le commentaire a la limite de caractères - donc je poste le code ici. –
juste trouvé une solution de contournement: Mettez un UITextField invisible dans la vue et en faire le premier répondeur. Ensuite, le menu copier-coller apparaîtra correctement. –
J'ai le même problème (ma vue personnalisée est une sous-classe de UITableViewCell, mais sinon c'est la même situation). Une invisible UITextField ne m'aide pas. Le menu n'est toujours pas affiché et le menuFrame est toujours à zéro. En outre, le clavier apparaît chaque fois que je fais un UITextField un premier répondeur. Pouvez-vous poster un exemple de code pour votre work-around? –