У меня есть код, и мне нужно получить выбранный диапазон TextView из (func textViewDidChangeSelection) в ContentView. Как мне сделать это в SwiftUI?
это основная идея моего кода.
struct ContentView: View {
@State private var text = ""
var body: some View {
UITextViewRepresentable(text: $text)
}
}
struct UITextViewRepresentable: UIViewRepresentable {
let textView = UITextView()
@Binding var text: String
func makeUIView(context: Context) -> UITextView {
textView.delegate = context.coordinator
return textView
}
func updateUIView(_ uiView: UITextView, context: Context) {
// SwiftUI -> UIKit
uiView.text = text
}
func makeCoordinator() -> Coordinator {
Coordinator(text: $text)
}
class Coordinator: NSObject, UITextViewDelegate {
@Binding var text: String
init(text: Binding<String>) {
self._text = text
}
func textViewDidChange(_ textView: UITextView) {
// UIKit -> SwiftUI
_text.wrappedValue = textView.text
}
func textViewDidChangeSelection(_ textView: UITextView) {
// Fires off every time the user changes the selection.
print(textView.selectedRange)
}
}
}





Просто добавьте для него дополнительную привязку типа NSRange, так как это тип textView.selectedRange.
Это означает добавление единицы к UIViewRepresentable:
struct UITextViewRepresentable: UIViewRepresentable {
let textView = UITextView()
@Binding var text: String
@Binding var range: NSRange // <---
и один координатору:
func makeCoordinator() -> Coordinator {
Coordinator(text: $text, range: $range) // <---
}
class Coordinator: NSObject, UITextViewDelegate {
@Binding var text: String
@Binding var range: NSRange // <---
init(text: Binding<String>, range: Binding<NSRange>) {
_text = text
_range = range
}
// ...
func textViewDidChangeSelection(_ textView: UITextView) {
range = textView.selectedRange
}
Теперь в ContentView вы можете получить его как @State:
@State private var text = ""
@State private var range = NSRange()
var body: some View {
UITextViewRepresentable(text: $text, range: $range)
}
большое спасибо @Sweeper за решение. Можете ли вы помочь с этим, мне действительно нужно добавить эту функцию, но у меня нет большой помощи в части swiftUI из любого места.