【问题标题】:UIMenuController does not show after changing the view controller更改视图控制器后 UIMenuController 不显示
【发布时间】: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的原因。并且在显示时处于正确位置。

标签: ios objective-c xcode uiviewcontroller uimenucontroller


【解决方案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 并且它可以工作,但屏幕上没有出现任何内容
    • 看看这个链接是否有意义stackoverflow.com/questions/3112925/…
    • 我已经尝试了所有方法,在我切换到新控制器之前它可以工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 2017-03-17
    相关资源
    最近更新 更多