SwiftUI设置textSelection(.enabled)后选中Text文本点击复制无内容问题
问题原因
- 这是iOS 15.0 ~ 16.3版本范围内的SwiftUI系统原生bug,
textSelection(.enabled)修饰符仅会渲染文本选中的交互UI,系统默认复制逻辑没有正确把对应文本内容写入系统剪贴板。 - 如果当前Text的父容器存在自定义长按手势、或者嵌套在自定义
UIPageViewController等自带手势响应的容器中,父容器手势的识别优先级更高,会拦截Text的默认复制事件,导致剪贴板写入失败。
解决方案
方案1:自定义复制逻辑适配旧系统
如果你的App需要兼容iOS 16.4以下的系统,可以放弃原生textSelection能力,自己通过上下文菜单实现复制能力:
Text("Hello, world!") .padding() .contextMenu { Button { UIPasteboard.general.string = "Hello, world!" } label: { Label("复制", systemImage: "doc.on.doc") } }
如果需要保留长按选中的高亮效果,可以额外加自定义的选中状态修饰符配合使用。
方案2:修复手势冲突
如果是父容器手势拦截导致的问题,抬高Text的手势优先级即可:
Text("Hello, world!") .textSelection(.enabled) .padding() .highPriorityGesture(LongPressGesture().onEnded { _ in })
方案3:升级最低支持系统版本
苹果已经在iOS 16.4版本修复了这个原生bug,如果你的App最低支持版本可以调整到iOS 16.4及以上,直接使用原生textSelection(.enabled)即可正常触发复制逻辑。
内容的提问来源于stack exchange,提问作者Underthestars-zhy
相关产品推荐
相关产品推荐

