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

标签 swiftui uiviewrepresentable

  • 创建一个简单的 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/

    相关文章:

    ios - SwiftUI:从单元格 View 中删除托管对象会使应用程序崩溃[非可选属性]?

    uitextfield - 使用 swiftUI 如何仅在 textField 处于编辑模式时添加 datePicker?

    swiftui - MFMessageComposeViewController + SwiftUI 错误行为

    ios - 通过 UIViewRepresentable 在 SwiftUI 中调整 UILabel 的大小,如 Text 以包裹多行

    ios - 如何在包装器 Swift View 中使用自定义 UIView 的扩展功能?

    uitableview - TableView 重新加载不适用于 SwiftUI 中的 UIViewRepresentable

    ios - UIViewRepresentable.updateUIView(_ :context:) is not called when @State, @Binding 或 @EnvironmentObject 已更改

    swift - 如何在 SwiftUI 中添加自定义容器 View

    ios - SF-Symbols 位于哪里?

    ios - SwiftUI - onChange 没有被调用