如何在UIMenuController的Paste与Look Up之间添加自定义菜单项?
没问题,我来帮你搞定这个需求!要把「Paste and Search」这个自定义菜单项精准插在系统默认的Paste和Look Up之间,你可以按照以下步骤操作:
1. 准备自定义菜单项并监听菜单显示通知
在你的ViewController(或者需要响应菜单的自定义View)里,先完成初始化和通知注册:
#import "YourViewController.h" @interface YourViewController () @property (nonatomic, strong) UIMenuItem *pasteAndSearchItem; @end @implementation YourViewController - (void)viewDidLoad { [super viewDidLoad]; // 创建自定义菜单项 self.pasteAndSearchItem = [[UIMenuItem alloc] initWithTitle:@"Paste and Search" action:@selector(pasteAndSearch:)]; // 注册菜单即将显示的通知,用来调整菜单项顺序 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuControllerWillShow:) name:UIMenuControllerWillShowMenuNotification object:nil]; } - (void)dealloc { // 记得移除通知监听 [[NSNotificationCenter defaultCenter] removeObserver:self]; }
2. 实现自定义菜单项的响应方法
添加你自定义的「Paste and Search」对应的处理逻辑:
- (void)pasteAndSearch:(id)sender { // 在这里实现你的粘贴并搜索逻辑 // 示例:先获取粘贴板内容,再执行搜索 UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; if (pasteboard.string.length > 0) { // 这里替换成你的搜索逻辑,比如打开搜索页面或者调用搜索接口 NSLog(@"Pasted content: %@, starting search...", pasteboard.string); } }
3. 控制菜单项的可用性
重写canPerformAction:withSender:方法,确保自定义菜单项和系统默认菜单项都能正常显示:
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender { // 允许自定义的pasteAndSearch:动作 if (action == @selector(pasteAndSearch:)) { // 只有当粘贴板有内容时才显示这个菜单项 return [UIPasteboard generalPasteboard].string.length > 0; } // 保留系统默认的菜单项(Cut/Copy/Paste/Look Up/Share) if (action == @selector(cut:) || action == @selector(copy:) || action == @selector(paste:) || action == NSSelectorFromString(@"define:") || action == NSSelectorFromString(@"share:")) { return [super canPerformAction:action withSender:sender]; } // 其他不需要的动作返回NO return NO; }
4. 调整菜单项顺序,插入到指定位置
在通知处理方法里,找到系统默认的Paste菜单项位置,把我们的自定义项插在它后面:
- (void)menuControllerWillShow:(NSNotification *)notification { UIMenuController *menuController = notification.object; NSMutableArray *menuItems = [menuController.menuItems mutableCopy]; if (!menuItems) return; // 找到Paste菜单项的索引 NSInteger pasteIndex = NSNotFound; for (NSInteger i = 0; i < menuItems.count; i++) { UIMenuItem *item = menuItems[i]; if (item.action == @selector(paste:)) { pasteIndex = i; break; } } // 如果找到了Paste的位置,就把自定义项插在它的下一个位置 if (pasteIndex != NSNotFound && ![menuItems containsObject:self.pasteAndSearchItem]) { [menuItems insertObject:self.pasteAndSearchItem atIndex:pasteIndex + 1]; menuController.menuItems = menuItems; } }
额外注意事项
- 如果是在自定义View里实现,别忘了把View的
userInteractionEnabled设为YES,并且确保View成为第一响应者(可以重写canBecomeFirstResponder返回YES)。 - 系统的Look Up对应的selector是
define:,Share对应的是share:,通过selector判断菜单项位置会比标题判断更准确。
内容的提问来源于stack exchange,提问作者lypw2009
相关产品推荐
相关产品推荐

