我只想在文本字段激活后立即显示UIMenuController 我现在正在做的是:
- (IBAction)textFieldeditingDidBegin:(UITextField *)sender {
// textfield menu item
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setTargetRect:sender.frame inView:self.view];
[menu setMenuVisible:YES animated:YES];
}
该方法被调用,但它不会显示菜单...
如果我在文本字段上执行触摸+保持手势,它会定期出现。
我希望有一个简单的解决方案, 感谢
答案 0 :(得分:7)
我找到了一个很好的解决方案。
使用此方法开始编辑文本字段时,可以轻松显示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
部分,以确保菜单在文本字段的容器视图中正确显示。
如果您还要禁用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];
}
这项工作在模拟器中非常好。我希望这会对你有帮助!
答案 1 :(得分:2)
更简单的解决方案:
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[textField select:nil];
UIMenuController *menuController = [UIMenuController sharedMenuController];
[menuController setMenuVisible:YES animated:YES];
}];
}