I'm trying to create a custom UIMenuController and display it in my view. Here's my 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];
There are no errors or exceptions, but the menu controller just doesn't show up.
You need to do three things:
-becomeFirstResponder
on the view or view controller.-canBecomeFirstResponder
(returning YES
).-canPerformAction:action withSender:sender
to show/hide menu items on an individual basis.The answer mentions three things, but to be picky, there are six:
-becomeFirstResponder
fails.userInteractionEnabled = YES
-window
property must be the same as the window for the view in the inView:
argument.-canBecomeFirstResponder
and return YES
.[handler becomeFirstResponder]
, before [menu setTargetRect:inView:]
is called, or the latter will fail.[menu setTargetRect:inView]
(at least once) and [menu setMenuVisible:animated:]
.In particular points 1-3 above got me. I wanted a custom menu handler class that was a UIResponder
at first, which caused -becomeFirstResponder
to return NO
; then it was a UIView
, which failed, then I tried making it a UIButton
which worked, but only because userInteractionEnabled
defaults to YES
for buttons and NO
for UIView
s.
UIMenuController
is visible on any view only if the view is first responder and
- (BOOL)canPerformAction
method returns YES
Hence if your menu controller is to be shown on button click, the first line in the button action should be [self becomeFirstResponder]
. NOTE: here self is the view which will present the menus.
If your menus are to be shown on long press gesture, then add longPressGesture to the UIView
and in the longpress event before writing
[menuController setTargetRect:CGRectMake(50.0, 50.0, 0, 0) inView:self.view];
[menuController setMenuVisible:YES animated:YES];
write [self becomeFirstResponder];
Then follow the steps mentioned by OZ.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With