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

SwiftUI中TextEditor的isEditable与isSelectable属性设置方法

SwiftUI中TextEditor的isEditable与isSelectable属性设置方法

我之前也碰到过这个难题!在AppKit里用NSTextView设置isEditable和isSelectable简直得心应手,但SwiftUI的TextEditor确实没直接把这两个属性暴露出来,不过咱们可以通过两种方式实现类似效果,看你需求来选:

一、简单控制可编辑性(无法单独控制文本选择)

如果你的需求只是控制文本是否能被编辑,不需要单独保留选择功能,那用SwiftUI自带的disabled修饰符就能快速搞定:

@State private var text = "示例文本"
@State private var isEditable = true

var body: some View {
    TextEditor(text: $text)
        .disabled(!isEditable)
        .frame(height: 200)
}

不过要注意,disabled会让整个TextEditor进入不可交互状态——如果isEditable设为false,文本不仅不能编辑,连选择复制都做不了。

二、独立控制可编辑和可选择(还原NSTextView的完整行为)

要是你需要像AppKit里那样,分开控制“是否允许编辑”和“是否允许选择文本”,就得通过封装原生文本视图来实现了。因为SwiftUI的TextEditor底层其实是iOS的UITextView或macOS的NSTextView,我们可以用UIViewRepresentable(iOS)或NSViewRepresentable(macOS)直接调用原生属性。

iOS版本封装

struct WrappedTextView: UIViewRepresentable {
    @Binding var text: String
    var isEditable: Bool
    var isSelectable: Bool
    
    func makeUIView(context: Context) -> UITextView {
        let textView = UITextView()
        textView.isEditable = isEditable
        textView.isSelectable = isSelectable
        textView.font = UIFont.systemFont(ofSize: 16)
        return textView
    }
    
    func updateUIView(_ uiView: UITextView, context: Context) {
        uiView.text = text
        // 每次状态更新时同步属性
        uiView.isEditable = isEditable
        uiView.isSelectable = isSelectable
    }
}

使用方式:

@State private var text = "示例文本"
@State private var isEditable = false
@State private var isSelectable = true

var body: some View {
    WrappedTextView(text: $text, isEditable: isEditable, isSelectable: isSelectable)
        .frame(height: 200)
}

macOS版本封装

struct WrappedNSTextView: NSViewRepresentable {
    @Binding var text: String
    var isEditable: Bool
    var isSelectable: Bool
    
    func makeNSView(context: Context) -> NSTextView {
        let textView = NSTextView()
        textView.isEditable = isEditable
        textView.isSelectable = isSelectable
        textView.font = NSFont.systemFont(ofSize: 16)
        return textView
    }
    
    func updateNSView(_ nsView: NSTextView, context: Context) {
        nsView.string = text
        nsView.isEditable = isEditable
        nsView.isSelectable = isSelectable
    }
}

这种封装方式完全复刻了NSTextView的控制逻辑,你可以自由组合isEditable和isSelectable的状态,比如允许选择但禁止编辑,或者两者都开启/关闭。

备注:内容来源于stack exchange,提问作者Mane Manero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:53:01