SwiftUI中如何在TextEditor的光标位置插入字符?
在SwiftUI TextEditor中插入字符到光标当前位置
SwiftUI原生TextEditor没有直接暴露光标位置的操作API,要实现将字符插入到光标当前位置而非字符串末尾,需要借助其底层的UITextView来实现,以下是具体方案:
实现步骤
- 创建一个
ObservableObject管理器,用来持有UITextView的引用并提供插入方法。 - 通过
UIViewRepresentable封装UITextView,桥接到SwiftUI并同步文本数据。 - 在视图中使用封装后的组件,点击按钮时调用管理器的插入方法。
完整代码示例
import SwiftUI import UIKit // 管理TextEditor的操作逻辑 class TextEditorManager: ObservableObject { weak var textView: UITextView? // 插入字符到光标当前位置 func insertCharacter(_ character: String) { textView?.insertText(character) } } // 封装UITextView为SwiftUI组件 struct CustomTextEditor: UIViewRepresentable { @Binding var text: String @EnvironmentObject var manager: TextEditorManager func makeUIView(context: Context) -> UITextView { let textView = UITextView() textView.font = .systemFont(ofSize: 28) // 对应SwiftUI的.largeTitle textView.delegate = context.coordinator textView.text = text manager.textView = textView return textView } func updateUIView(_ uiView: UITextView, context: Context) { // 避免文本同步时打乱光标位置 if uiView.text != text { uiView.text = text } } func makeCoordinator() -> Coordinator { Coordinator(self) } class Coordinator: NSObject, UITextViewDelegate { var parent: CustomTextEditor init(_ parent: CustomTextEditor) { self.parent = parent } // 同步UITextView的文本到SwiftUI的绑定变量 func textViewDidChange(_ textView: UITextView) { parent.text = textView.text } } } // 主视图 struct ContentView: View { @State var text = "" @StateObject private var editorManager = TextEditorManager() var body: some View { VStack(spacing: 20) { CustomTextEditor(text: $text) Button("➡️") { editorManager.insertCharacter("➡️") } .font(.largeTitle) } .padding() .environmentObject(editorManager) } }
关键说明
TextEditorManager中调用的insertText是UITextView的原生API,会自动将字符插入到当前光标所在位置,无需手动计算光标偏移。- 封装组件时通过
Coordinator监听文本变化,确保SwiftUI的@State变量与UITextView的文本保持同步。 - 使用
weak引用UITextView避免循环引用,符合内存管理规范。
内容的提问来源于stack exchange,提问作者Peter_22
相关产品推荐
相关产品推荐

