Привязка массива в NSViewRepresentable неправильно обновляется после сортировки
У меня есть привязка к массиву элементов. У каждого элемента есть индекс (который представляет, как он должен быть отсортирован) и некоторый текст. В каждой строке естьNSTextView
вNSViewRepresentable
(не могу использовать по разным причинам), который использует привязку для файла . Однако после сортировки списка, если я обновлю NSTextView, одно из других представлений также получит обновление:
Вот мой код:
struct ListItem: Hashable, Identifiable {
var index: Int
var text: String
var id = UUID()
static let initialItems: [ListItem] = [
.init(index: 2, text: "String 2"),
.init(index: 0, text: "String 0"),
.init(index: 1, text: "String 1"),
]
}
struct ContentView: View {
@State var items = ListItem.initialItems
var body: some View {
Form {
ForEach($items) { item in
HStack {
TextField("Index: ", value: item.index, format: .number)
.textFieldStyle(.roundedBorder)
TVRep(text: item.text)
}
}
Button("Sort!") {
items.sort(by: {$0.index < $1.index})
}
}
.padding()
}
}
struct TVRep: NSViewRepresentable {
@Binding var text: String
func makeNSView(context: Context) -> NSTextView {
let view = NSTextView()
view.string = text
view.delegate = context.coordinator
return view
}
func updateNSView(_ nsView: NSTextView, context: Context) {
nsView.string = text
}
func makeCoordinator() -> Coordinator {
Coordinator(parent: self)
}
class Coordinator: NSObject, NSTextViewDelegate {
var parent: TVRep!
init(parent: TVRep) {
super.init()
self.parent = parent
}
func textDidChange(_ notification: Notification) {
guard let tv = notification.object as? NSTextView else {return}
parent.text = tv.string
}
}
}
Этого не происходит при использовании встроенного в SwiftUITextEditor
. Интересно, что это происходит только тогда, когда я обновляюtext
значение привязки в представлении Representable - если у меня нет метода делегата, обновляющего значение привязки, этого не происходит.
Я знаю, что если я позвонюsorted(by:)
вForEach
аргумент, что он будет обновляться правильно, но это означает, что момент, когдаTextField
ибо индекс обновляется, представления сортируются, а я хочу иметь возможность сортировать их вручную.