SwiftUI не обновляет мой пользовательский UIView с помощью UIViewRepresentable и ObservableObject

  1. создать простой ARClass: ObservableObject с @Published var name: String
  2. создать собственный ARView: UIView получил ARClass в качестве параметра и отрисовал текст из ARClass.name в центре
  3. создать UIViewRepresentable

а затем использовать в SwuftUI View, используя ARClass (цвет:.red, имя: "Тестовый текст") в качестве объекта среды в SceneDelegate

class ARClass: ObservableObject {
@Published var bg: UIColor
@Published var name: String

init(color: UIColor, name: String) {
    self.bg = color
    self.name = name
}

}

struct ARViewX: UIViewRepresentable {
var ar: ARClass
var frame: CGRect

func updateUIView(_ uiView: ARView, context: Context) {
    uiView.frame = frame
    uiView.ar = ar
    uiView.setNeedsDisplay()
}
func makeUIView(context: Context) -> ARView {
    ARView(ar: ar, frame: frame)
}

}

struct ContentView: View {
@EnvironmentObject var ar: ARClass
var body: some View {
    GeometryReader { g in
        VStack {
            Spacer()
                ARViewX(ar: self.ar, frame: CGRect(origin: .zero, size: .init(width: g.size.width, height: g.size.height/3)))
                .padding()
            Spacer()
            Text(self.ar.name)
            Divider()
            TextField("Name", text: self.$ar.name)
                .textFieldStyle(RoundedBorderTextFieldStyle())
                .padding()
            Spacer()
        }
    }
}

}

Когда я редактировал TextField, обновляется все тело, за исключением UIViewRepresentable, он всегда сбрасывает переменную name в исходное значение.

1 ответ

По прошествии нескольких часов я наконец знаю, что updateUIView(_ uiView: ARView, context: Context) в UIViewRepresentable никогда не вызывается, поэтому я изменяю ARClass и UIViewRepresentable следующим образом

class ARClass: ObservableObject {
@Published var bg: UIColor
@Published var name: String {
    didSet {
        if let onNameChange = onNameChange {
            onNameChange()
        }
    }
}
var onNameChange: (()->Void)?
init(color: UIColor, name: String) {
    self.bg = color
    self.name = name
}

}

func updateUIView(_ uiView: ARView, context: Context) {
    uiView.frame = frame
    ar.onNameChange = {
        uiView.setNeedsDisplay()
    }
}
Другие вопросы по тегам