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
相关产品推荐
相关产品推荐

