UIMenuController没有显示出来

ind*_*gie 60 iphone cocoa-touch objective-c uimenucontroller ipad

我正在尝试创建一个自定义的UIMenuController并在我的视图中显示它.这是我的代码:

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];
Run Code Online (Sandbox Code Playgroud)

没有错误或异常,但菜单控制器只是没有出现.

小智 162

你需要做三件事:

  1. 您需要调用-becomeFirstResponder视图或查看控制器.
  2. 您的视图或视图控制器需要实现-canBecomeFirstResponder(返回YES).
  3. (可选)您的视图或视图控制器可以实现-canPerformAction:action withSender:sender单独显示/隐藏菜单项.

  • 当我在视图*上调用`becomeFirstResponder`*时没有工作.在控制器上调用它工作正常. (4认同)
  • 只要我实现了第3步(不是可选的),我就可以在_view_上工作了. (4认同)
  • 要确保对becomeFirstResponder的调用成功,您可以检查它返回的BOOL是否为YES.否则,您可能希望UIMenuController的呈现失败. (2认同)
  • - canBecomeFirstResponder是我的挂断,谢谢. (2认同)

Kal*_*lle 19

答案提到了三件事,但要挑剔,有六件事:

  1. 菜单处理程序必须是UIView.如果不是,则-becomeFirstResponder失败.
  2. 菜单处理程序必须具有 userInteractionEnabled = YES
  3. 菜单处理程序必须位于视图层次结构中,其-window属性必须与inView:参数中视图的窗口相同.
  4. 你需要实现-canBecomeFirstResponder并返回YES.
  5. 在调用之前需要调用[handler becomeFirstResponder],否则后者将失败. [menu setTargetRect:inView:]
  6. 你需要打电话[menu setTargetRect:inView](至少一次)和[menu setMenuVisible:animated:].

特别是上面1-3点得到了我.我想要一个自定义菜单处理程序类UIResponder,它首先导致-becomeFirstResponder返回NO; 然后它是一个UIView,它失败了,然后我试图使其成为UIButton其工作,但只是因为userInteractionEnabled默认YES按钮和NOUIView秒.


小智 15

UIMenuController 仅当视图是第一响应者时才在任何视图上可见

- (BOOL)canPerformAction 方法返回 YES

因此,如果要在按钮单击时显示菜单控制器,则按钮操作中的第一行应为[self becomeFirstResponder].注意:此处self是将显示菜单的视图.

如果要在长按手势上显示菜单,则UIView在写入之前将longPressGesture 添加到longpress事件中

[menuController setTargetRect:CGRectMake(50.0, 50.0, 0, 0) inView:self.view];
[menuController setMenuVisible:YES animated:YES];
Run Code Online (Sandbox Code Playgroud)

[self becomeFirstResponder];

然后按照OZ提到的步骤进行操作.


Dur*_*n.H 5

以下是完整评论的工作示例...

查看子类头文件

#import <Foundation/Foundation.h>

@interface MenuControllerSupportingView : UIView
{

}
@end
Run Code Online (Sandbox Code Playgroud)

查看子类源文件

#import "MenuControllerSupportingView.h"

@implementation MenuControllerSupportingView

//It's mandatory and it has to return YES then only u can show menu items..
-(BOOL)canBecomeFirstResponder
{
  return YES;
}

-(void)MenuItemAClicked
{
  NSLog(@"Menu item A clicked");
}

-(void)MenuItemBClicked
{
 NSLog(@"Menu item B clicked");
}

-(void)MenuItemCClicked
{
  NSLog(@"Menu item C clicked");
}

//It's not mandatory for custom menu items

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{  
  if(action == @selector(MenuItemAClicked))
     return YES;
  else if(action == @selector(MenuItemBClicked))
    return YES;
  else if(action == @selector(MenuItemCClicked))
    return YES;
  else
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

查看控制器头文件

#import <UIKit/UIKit.h>

@interface ViewController1 : UIViewController

@end
Run Code Online (Sandbox Code Playgroud)

查看控制器源文件

 #import "ViewController1.h"
 #import "MenuControllerSupportingView.h"

@interface ViewController1 ()
{
 MenuControllerSupportingView *vu;
}
@end

@implementation ViewController1

 - (void)viewDidLoad
{
  [super viewDidLoad];

  vu=[[SGGI_MenuControllerSupportingView alloc]initWithFrame:CGRectMake(0,0,768,1024)];

[self.view addSubview:vu];

 UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];

 [btn setFrame:CGRectMake(200,200,200,30)];

 [btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];

 [btn setTitle:@"Show" forState:UIControlStateNormal];

 [btn addTarget:self action:@selector(SHowMenu) forControlEvents:UIControlEventTouchUpInside];

 [vu addSubview:btn];

}

-(void)SHowMenu
{
 UIMenuController *menucontroller=[UIMenuController sharedMenuController];

UIMenuItem *MenuitemA=[[UIMenuItem alloc] initWithTitle:@"A" action:@selector(MenuItemAClicked)];

UIMenuItem *MenuitemB=[[UIMenuItem alloc] initWithTitle:@"B" action:@selector(MenuItemBClicked)];

UIMenuItem *MenuitemC=[[UIMenuItem alloc] initWithTitle:@"C" action:@selector(MenuItemCClicked)];

[menucontroller setMenuItems:[NSArray arrayWithObjects:MenuitemA,MenuitemB,MenuitemC,nil]];

    //It's mandatory
[vu becomeFirstResponder];

    //It's also mandatory ...remeber we've added a mehod on view class
if([vu canBecomeFirstResponder])
{

    [menucontroller setTargetRect:CGRectMake(10,10, 0, 200) inView:vu];

    [menucontroller setMenuVisible:YES animated:YES];
}

}




-(void)didReceiveMemoryWarning
{
  [super didReceiveMemoryWarning];

}

@end
Run Code Online (Sandbox Code Playgroud)

在View类中,如果您在canPerformAction中单独写返回YES,您将看到所有默认菜单项,例如摄像机符号,剪切,复制等。

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
 return YES;
}
Run Code Online (Sandbox Code Playgroud)

如果你想单独显示像照相机这样的东西

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
if(action==@selector(_insertImage:))
     return YES;
else
     return NO;

}
Run Code Online (Sandbox Code Playgroud)

如果你想知道所有动作,那么

访问链接