Existem outras respostas no SO sobre esse problema, mas nenhuma resolveu o problema porque, no meu caso, estou usando uma NSViewRepresentable
visualização cacau, que não é exatamente uma visualização SwiftUI.
Eu tenho este código:
struct MyObject: Hashable, Identifiable {
let id: UUID = UUID()
var name, brand: String
init(name: String = "", brand: String = "") {
self.name = varName
self.brand = brand
}
}
final class Model:ObservableObject {
@Published var objects = (0..<3).compactMap {_ in
return MyObject()
}
}
struct ContentView: View {
private let columns = [GridItem(.flexible()), GridItem(.flexible())]
@StateObject private var model = Model()
var body: some View {
VStack{
LazyVGrid(
columns: columns,
alignment: .center,
spacing: 10,
pinnedViews: []
) {
ForEach($model.objects, id:\.id) {$object in
MyTextField($initObject)
}
}
}
.padding(20)
}
}
struct MyTextField: View {
@Binding private var initObject:InitObject
init(_ initObject:Binding<InitObject>) {
_initObject = initObject
}
var body: some View {
AppKitTextField(property: $initObject.name,
placeholder: "name",
fontName:"Avenir-Medium",
fontSize:18) { text in
}
MyAppKitTextField(property: $initObject.type,
placeholder: "type",
fontName:"Avenir-Medium",
fontSize:18)
}
}
O problema é que MyAppKitTextField
é um AppKit NSTextField
NSViewRepresentable
, assim:
public struct AppKitTextField: NSViewRepresentable {
public typealias NSViewType = NSTextField
@Binding var property: String
public init(property: Binding<String>) {
self._property = property
}
public class Coordinator: NSObject, NSTextFieldDelegate {
@Binding private var text: String
init(text: Binding<String>) {
self._text = text
}
}
public func makeNSView(context: NSViewRepresentableContext<AppKitTextField>) -> NSTextField {
let textField = NSTextField()
textField.delegate = context.coordinator
textField.stringValue = property
return textField
}
public func makeCoordinator() -> AppKitTextField.Coordinator {
return Coordinator(text: $property)
}
public func updateNSView(_ nsView: NSTextField, context: Context) {
nsView.stringValue = property
}
}
}
Meu problema é a linha
@Binding var property: String
Quando tento usar essa visualização, vejo este erro:
Accessing StateObject's object without being installed on a View. This will create a new instance each time.
Meu primeiro palpite é que
@Binding
o wrapper de propriedade não deve ser usado naCoordinator
classe, pois não é umView
local@Binding
projetado para ser usado. Em vez disso, você pode usarBinding<String>
ou apenas um fechamento, já que você só precisa definir de qualquer maneira.Meu segundo palpite é este erro:
Deveria ser:
Para sua informação, a ligação é apenas um par de fechamentos get/set, não há necessidade de fornecer a ligação ao coordenador porque ela não precisa do get, esse é o motivo do
textDidChange
fechamento somente definido que você deve invocar do seu delegado ou manipulador de ação .