gpt4 book ai didi

SwiftUI 不会使用 UIViewRepresentable 和 ObservableObject 刷新我的自定义 UIView

转载 作者:行者123 更新时间:2023-12-03 16:12:39 35 4
gpt4 key购买 nike

  • 创建一个简单的 ARClass: ObservableObject with @Published var
    名称:字符串
  • 创建自定义 ARView:UIView 接收 ARClass 作为
    参数并从 ARClass.name 中心绘制文本
  • 创建 UIViewRepresentable

  • 然后在 SwuftUI View 中使用 ARClass(color: .red, name: "Test Text") 作为 SceneDelegate 中的 Environment 对象
    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 之外,整个主体都会刷新,它总是将“名称”变量重置为其初始值。

    最佳答案

    几个小时后,我终于知道 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 不会使用 UIViewRepresentable 和 ObservableObject 刷新我的自定义 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58142942/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com