皆さんの回答を全部読んでもうまくいきませんでした。誰にとっても機能する準備ができたコードを提示しています。
Controller という名前のコントローラー クラスがあるとします。次のコードをこのコントローラーに貼り付けるだけで、ビューでメニューを機能させることができます。
- (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;
}
メニューが機能するために行う必要があるのは、firstResponder (この場合はコントローラー - [self becomeFirstResponder] の行を参照) がファーストレスポンダーになれる必要があることです (メソッド canBecomeFirstResponder をオーバーライドすると、デフォルトの実装は NO を返します)。によって- (BOOL) canPerformAction:(SEL)selector withSender:(id) sender
実行できるすべてのアクションに YES を返す必要があります。firstResponder