You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在UIMenuController的Paste与Look Up之间添加自定义菜单项?

实现UIMenuController插入自定义菜单项到指定位置

没问题,我来帮你搞定这个需求!要把「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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:26:18