更改视图控制器后 UIMenuController 不显示

Posted

技术标签:

【中文标题】更改视图控制器后 UIMenuController 不显示【英文标题】:UIMenuController does not show after changing the view controller 【发布时间】:2014-06-09 04:30:12 【问题描述】:

我有 2 个视图控制器,在第一个视图控制器中,我使用 tapRecognizer 按住以显示 UImenucontroller 以复制字符串。点击用于选择导航栏上的标题,它会显示一个带有复制项的 UImenucontroller。

它在第一次时有效,但是当用户切换到另一个视图控制器并再次回到第一个视图控制器时,菜单不再显示。

-(void)viewDidLoad
    [super viewDidLoad];
    UIView *viewWithTitleLabel = self.navigationController.navigationBar.subviews[1];
    viewWithTitleLabel.userInteractionEnabled = YES;

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(topBarTitleTap:)];
    [viewWithTitleLabel addGestureRecognizer:longPress];


-(void)topBarTitleTap:(UILongPressGestureRecognizer *)gestureRecognizer

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan) 
        UIMenuController *menuController = [UIMenuController sharedMenuController];
        [menuController setTargetRect:CGRectMake(CGRectGetMidX([self.view bounds]), -12.0, 0.0f, 0.0f) inView:self.view];
        [menuController setMenuVisible:YES animated:YES];
    


- (void) copy:(id) sender 
    // called when copy clicked in tab bar title
    NSString *copyStringverse = self.navigationItem.title;
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    [pasteboard setString:copyStringverse];


- (BOOL) canBecomeFirstResponder 
    return YES;

【问题讨论】:

当我尝试你的代码时,它根本不起作用。如果我在 setTargetRect: 方法中为 y 值传递了类似 40 而不是 -12 的值,那么即使在转到另一个控制器并返回之后,它也每次都能正常工作。 这个视图是一个子视图,嵌入在导航视图控制器中,这就是我添加-12的原因。并且在显示时处于正确位置。 【参考方案1】:

添加 [self becomeFirstResponder];弹出 UIMenuController 之前 例如,您可以按如下方式更改您的代码

-(void)topBarTitleTap:(UILongPressGestureRecognizer *)gestureRecognizer

    [self becomeFirstResponder];
    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan) 
        UIMenuController *menuController = [UIMenuController sharedMenuController];
        [menuController setTargetRect:CGRectMake(CGRectGetMidX([self.view bounds]), -12.0, 0.0f,     0.0f) inView:self.view];
        [menuController setMenuVisible:YES animated:YES];
    

别忘了实施

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender

    //Customize your action if statement here
    return YES;

对于您的视图控制器

【讨论】:

【参考方案2】:

每次检查 LongPressGestureRecognizer 是否正常工作。

为了安全起见,我会将手势识别器代码放在 viewDidAppear 中而不是 ViewDidLoad 中

【讨论】:

我已经测试了将 NSLog 放入 tapRecognizer 并且它可以工作,但屏幕上没有出现任何内容 看看这个链接是否有意义***.com/questions/3112925/… 我已经尝试了所有方法,在我切换到新控制器之前它可以工作

以上是关于更改视图控制器后 UIMenuController 不显示的主要内容,如果未能解决你的问题,请参考以下文章

是否可以自定义 UIMenuController 的颜色?

只能有一个 UIMenuController 实例

在 UIMenuController 出现之前更改用于 UIMenuController 的标签标题

没有显示 uitextview 的 uimenucontroller,通用应用程序 xcode 4

选择文本时,如何用我自己的视图替换 UIMenuController?

如何在 UIMenuController 的自定义操作中获取点击的表格视图单元格