yo no era capaz de conseguir que funcione incluso cuando leí todas sus respuestas. Estoy presentando un código listo que funcionará para todos.
Digamos que tenemos una clase de controlador llamada Controller. Usted puede simplemente pegar el código siguiente para este controlador para tener el menú de trabajo en su opinión:
- (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;
}
Lo que hay que hacer para que el menú de trabajo es que el firstResponder (en nuestro caso nuestro controlador - ver la línea con [libre becomeFirstResponder]) tiene que ser capaz de convertirse en primer respondedor (override método canBecomeFirstResponder aplicación causa predeterminada devuelve NO), así como - (BOOL) canPerformAction:(SEL)selector withSender:(id) sender
que debe devolver SÍ a cualquier acción que puede ser realizado por firstResponder
el comentario tiene el límite de caracteres, así que publico el código aquí. –
acaba de encontrar una solución alternativa: Ponga un UITextField invisible en la vista y conviértalo en el primer respondedor. Luego, el menú copiar y pegar aparecerá correctamente. –
Estoy teniendo el mismo problema (mi vista personalizada es una subclase de UITableViewCell, pero de lo contrario es la misma situación). Un UITextField invisible no me está ayudando. El menú aún no se muestra y el menúFrame sigue siendo todo ceros. Además, el teclado aparece cada vez que hago de UITextField un firstResponder. ¿Puedes publicar un código de muestra para tu trabajo? –