在UITextField的editingDidBegin中显示UIMenuController

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

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

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

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

我找到了一个很好的解决方案。

使用此方法开始编辑文本字段时,可以轻松地显示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:textField.superview更改了setTargetRect::方法的inView:textField.superview部分,以确保菜单在文本字段的容器视图中正确显示。

如果您还想禁用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]; } 

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

更简单的解决方案:

 - (void)textFieldDidBeginEditing:(UITextField *)textField { [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [textField select:nil]; UIMenuController *menuController = [UIMenuController sharedMenuController]; [menuController setMenuVisible:YES animated:YES]; }]; }