【问题标题】:SwiftUI not refresh my custom UIView with UIViewRepresentable & ObservableObjectSwiftUI 不使用 UIViewRepresentable 和 ObservableObject 刷新我的自定义 UIView
【发布时间】:2020-01-28 06:36:52
【问题描述】:
  1. 创建一个简单的 ARClass:带有 @Published var 的 ObservableObject 名称:字符串
  2. 创建自定义 ARView:UIView 收到的 ARClass 为 参数并在中心从 ARClass.name 绘制文本
  3. 创建 UIViewRepresentable

然后在 SceneDelegate 中使用 ARClass(color: .red, name: "Test Text") 作为 Environment 对象在 SwuftUI View 中使用

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 之外,整个正文都会刷新,它总是将“名称”变量重置为其初始值。

【问题讨论】:

    标签: swiftui uiviewrepresentable


    【解决方案1】:

    几个小时后,我终于知道 UIViewRepresentable 中的 updateUIView(_ uiView: ARView, context: Context) 永远不会被调用,所以我像这样修改了 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()
        }
    }
    

    【讨论】:

    • 不敢相信没有像这样更好的解决方案。但是我也没有找到。它不是很 SwiftUI 风格。
    • 我遇到了几乎同样的问题:对我来说 updateUIView 在我第一次更新模型时被调用,但在任何后续更新中都没有。
    猜你喜欢
    • 2020-09-29
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 2022-01-22
    • 1970-01-01
    • 2021-09-30
    • 2020-01-25
    相关资源
    最近更新 更多