SwiftUI 不会刷新我的自定义 UIView with UIViewRepresentable & ObservableObject



我有

  1. @Published var name: String创建了一个简单的ARClass: ObservableObject
  2. 创建了一个自定义ARView: UIView,该接收ARClass参数并绘制一个Text视图,在中心显示ARClass.name
  3. 创建UIViewRepresentable

然后在 SwiftUIView中使用ARClass(color: .red, name: "Test Text")作为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"变量重置为其初始值。

几个小时后,我终于知道UIViewRepresentable中的updateUIView(_ uiView: ARView, context: Context)从未被调用过,所以我像这样修改了ARClass

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
}
}

UIViewRepresentable是这样的:

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

最新更新