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

iOS16如何移除UITextView默认菜单Open Link等项仅保留复制项

iOS16下自定义UITextView上下文菜单仅保留「Copy」选项实现方案

问题根因

iOS 16 调整了UITextView链接类上下文菜单的生成链路,直接重写canPerformAction(_:withSender:)返回false,无法拦截系统为链接交互单独注入的「Open Link」「Add to Reading List」菜单项——这两个选项不经过旧的响应链动作校验流程,旧的拦截方案对其无效。

具体实现

在自定义UITextView子类中同时重写两个方法,同时覆盖旧版本链路和iOS16新增的菜单构建链路即可:

class CustomTextView: UITextView {
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        // 旧版本系统下仅放行复制动作,拦截其余所有默认菜单项
        return action == #selector(copy(_:))
    }

    override func buildMenu(with builder: UIMenuBuilder) {
        // iOS16+ 移除系统注入的链接操作、阅读列表相关菜单组
        builder.remove(menu: .link)
        builder.remove(menu: .readingList)
        super.buildMenu(with: builder)
    }
}

补充说明

  • 上述实现向下兼容iOS16以下系统:低版本不会触发buildMenu(with:)调用,仅靠canPerformAction的逻辑即可完成菜单过滤,无兼容性问题
  • 若后续发现其他多余的系统菜单项,可通过打印builder内置的系统菜单标识,调用remove(menu:)按需移除即可
  • 该方案不会影响链接的基础点击交互,若需要自定义链接点击跳转逻辑,正常实现UITextViewDelegate的对应代理方法即可

问题效果参考


内容的提问来源于stack exchange,提问作者chaselop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:57:21