在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]; }]; }