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

如何让SwiftUI Text支持长按单词唤起查询菜单及单词选中?

SwiftUI Text实现长按单词唤起查询菜单及单词选中功能

一、你提到的图中组件

你说的图中组件是iOS系统原生的文本交互菜单,长按可交互文本后弹出,包含“查询”“复制”“定义”等选项,是系统为文本组件提供的标准交互功能。

二、原代码的问题

.textSelection(.enabled)仅能让SwiftUI的Text支持手动选中文本,但它不会自动识别单词并触发查询菜单——这是因为SwiftUI的Text在文本交互的精细化控制上,和UIKit的UITextView存在差异。

三、实现方案

方案1:用UIViewRepresentable包装UITextView(推荐,完整支持系统交互)

UITextView默认支持长按单词自动选中并弹出查询菜单,我们可以把它封装成SwiftUI可用的组件:

struct SelectableTextView: UIViewRepresentable {
    let text: String
    
    func makeUIView(context: Context) -> UITextView {
        let textView = UITextView()
        textView.text = text
        textView.isEditable = false
        textView.isSelectable = true
        // 开启数据检测器,提升文本识别能力
        textView.dataDetectorTypes = .all
        // 匹配SwiftUI Text的默认样式
        textView.font = UIFont.preferredFont(forTextStyle: .body)
        textView.backgroundColor = .clear
        return textView
    }
    
    func updateUIView(_ uiView: UITextView, context: Context) {
        uiView.text = text
    }
}

// 使用示例
struct ContentView: View {
    var body: some View {
        SelectableTextView(text: "Hello World!")
            .padding()
    }
}

方案2:优化SwiftUI Text的交互(有限支持)

如果坚持使用SwiftUI原生Text,可尝试以下代码(iOS 16+可用):

Text("Hello World!")
    .textSelection(.enabled)
    .contentShape(Rectangle())
    .textInteraction(.enabled)

但这种方式的交互体验不如UITextView稳定,无法保证每次长按都能精准选中单个单词并唤起查询菜单。

四、注意事项

  • 确保设备已开启“设置-通用-词典”功能,否则长按单词不会出现“查询”选项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:02:15