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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:34:57