non ero in grado di farlo funzionare anche quando ho letto tutte le vostre risposte. Sto presentando un codice pronto che funzionerà per tutti.
Diciamo che abbiamo una classe controller denominata Controller. Si può semplicemente incollare il seguente codice a questo controller di avere il menù lavorare sul suo punto di vista:
- (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;
}
Ciò che deve essere fatto al fine per il menu di lavoro è che il firstResponder (nel nostro caso il nostro controller - vedi linea con [sé becomeFirstResponder]) deve essere in grado di diventare primo responder (Override metodo canBecomeFirstResponder attuazione causa predefinita restituisce NO) nonché - (BOOL) canPerformAction:(SEL)selector withSender:(id) sender
che restituisce sI a qualsiasi azione che può essere eseguita da firstResponder
il commento ha il limite di caratteri - quindi inserisco il codice qui. –
appena trovato una soluzione: Metti un UITextField invisibile nella vista e fallo diventare il primo risponditore. Quindi il menu copia-incolla verrà visualizzato correttamente. –
Sto avendo lo stesso problema (la mia vista personalizzata è una sottoclasse di UITableViewCell, ma altrimenti è la stessa situazione). Un UITextField invisibile non mi sta aiutando. Il menu non viene ancora visualizzato e il menu Frame è ancora tutti zeri. Inoltre, la tastiera si apre ogni volta che faccio diventare UITextField un firstResponder. Puoi pubblicare qualche codice di esempio per il tuo lavoro? –