1

我只想在文本字段变为活动状态后立即显示 UIMenuController。
我现在正在做的是:

- (IBAction)textFieldeditingDidBegin:(UITextField *)sender {
    // textfield menu item
    UIMenuController *menu = [UIMenuController sharedMenuController];
    [menu setTargetRect:sender.frame inView:self.view];
    [menu setMenuVisible:YES animated:YES];
}

该方法被调用,但它不会显示菜单......
如果我在文本字段上执行触摸+按住手势,它会定期出现。

我希望有一个简单的解决方案,谢谢

4

2 回答 2

8

我为您的问题找到了一个很好的解决方案。

UIMenuController当您开始使用此方法编辑文本字段时,您可以轻松地使其出现:

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    double delayInSeconds = 0.1;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        UIMenuController *menu = [UIMenuController sharedMenuController];
        [menu setTargetRect:textField.frame inView:textField.superview];
        [menu setMenuItems:[NSArray arrayWithObjects:
                            [[UIMenuItem alloc] initWithTitle:@"Test" action:@selector(test)],
                            nil]];
        [menu setMenuVisible:YES animated:YES];
    });
}

我使用该dispatch_after调用来确保在完成所有默认系统调用UITextField显示菜单。

我还更改了方法的inView:self.view一部分,以确保菜单在文本字段的容器视图中正确显示。setTargetRect::inView:textField.superview

如果您还想禁用 a 的默认菜单控件,UITextField可以将此方法添加到控制器:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(cut:))
        return NO;
    else if (action == @selector(copy:))
        return NO;
    else if (action == @selector(paste:))
        return NO;
    else if (action == @selector(select:) || action == @selector(selectAll:))
        return NO;
    else
        return [super canPerformAction:action withSender:sender];
}

这在模拟器中工作得非常好。我希望这能帮到您!

于 2012-07-09T13:19:38.747 回答
2

一个更简单的解决方案:

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        [textField select:nil];
        UIMenuController *menuController = [UIMenuController sharedMenuController];
        [menuController setMenuVisible:YES animated:YES];
    }];
}
于 2013-02-16T21:03:54.617 回答