当换行符在最后一行之前+该行最后一个字符之后开始时,光标始终跳到 UIViewRepresentable TextView 的末尾

Bre*_*mbs 3 textview ios swift swiftui uiviewrepresentable

I\xe2\x80\x99m 取决于使用此处创建的 UIViewRepresentable 的 TextView https://www.appcoda.com/swiftui-textview-uiviewrepresentable/

\n
struct TextView: UIViewRepresentable {\n    \n    @Binding var text: String\n    @Binding var textStyle: UIFont.TextStyle\n    \n    func makeUIView(context: Context) -> UITextView {\n        let textView = UITextView()\n        \n        textView.delegate = context.coordinator\n        textView.font = UIFont.preferredFont(forTextStyle: textStyle)\n        textView.autocapitalizationType = .sentences\n        textView.isSelectable = true\n        textView.isUserInteractionEnabled = true\n        \n        return textView\n    }\n    \n    func updateUIView(_ uiView: UITextView, context: Context) {\n        uiView.text = text\n        uiView.font = UIFont.preferredFont(forTextStyle: textStyle)\n    }\n    \n    func makeCoordinator() -> Coordinator {\n        Coordinator($text)\n    }\n    \n    class Coordinator: NSObject, UITextViewDelegate {\n        var text: Binding<String>\n\n        init(_ text: Binding<String>) {\n            self.text = text\n        }\n        \n        func textViewDidChange(_ textView: UITextView) {\n            self.text.wrappedValue = textView.text\n        }\n    }\n}\n\nstruct ContentView: View {\n    \n    @State private var message = ""\n    @State private var textStyle = UIFont.TextStyle.body\n    \n    var body: some View {\n        ZStack(alignment: .topTrailing) {\n            TextView(text: $message, textStyle: $textStyle)\n                .padding(.horizontal)\n            \n            Button(action: {\n                self.textStyle = (self.textStyle == .body) ? .title1 : .body\n            }) {\n                Image(systemName: "textformat")\n                    .imageScale(.large)\n                    .frame(width: 40, height: 40)\n                    .foregroundColor(.white)\n                    .background(Color.purple)\n                    .clipShape(Circle())\n                \n            }\n            .padding()    \n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

I\xe2\x80\x99m 遇到的问题是每当我在最后一行之前开始换行 1) + 2) 在该行的最后一个字符之后,光标总是跳到文本中的最后一个字符之后。有任何想法吗?

\n

更新

\n

Leo\xe2\x80\x99s 响应从技术上解决了这个问题,但 \xe2\x80\x99s 似乎并不完美,因为 \xe2\x80\x99s 出现了不需要的滚动行为,尽管插入符位置现在是正确的,但 \xe2\x80\ x99t 停止自动滚动到底部。见下文:

\n

在此输入图像描述

\n

Leo*_*bus 5

在 updateUIView 方法中设置 text 属性后,您可以保存插入符号位置 (selectedRange) 并设置文本视图选定范围:

func updateUIView(_ uiView: UITextView, context: Context) {
    let selectedRange = uiView.selectedRange
    uiView.text = text
    uiView.font = .preferredFont(forTextStyle: textStyle)
    uiView.selectedRange = selectedRange
}
Run Code Online (Sandbox Code Playgroud)