Привязка массива в 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ибо индекс обновляется, представления сортируются, а я хочу иметь возможность сортировать их вручную.

0 ответов

Другие вопросы по тегам