在SwiftUI中向NSViewPepresentable / UIViewRepresentable添加首选项键

时间:2020-10-03 17:04:53

标签: swiftui

我有一个自定义AppKit / UIKit视图的实例,该实例包装在**ViewRepresentable中,该实例需要在SwiftUI层次结构中传达一些诊断信息。由于此信息不是最重要的信息,因此我想使用PreferenceKey API来执行此操作,以便父视图只能在需要时订阅它。不幸的是,由于无法评估视图结构本身,因此无法使用preference() API,因此无法在视图上设置首选项键。有什么方法可以通过协调器设置首选项键?

1 个答案:

答案 0 :(得分:1)

这里是可能方法的简单演示。在Xcode 12 / iOS 14上进行了测试。该想法是使用注入的首选项键构造UIViewRepresentable。

struct DemoView: View {
    @State private var diag = CGFloat.zero
    var body: some View {
        VStack {
            Text("Diagnostic >> \(diag)")
                .background(MyUIRep.trackingRep)
        }
        .onPreferenceChange(MyPrefKey.self) { value in
            self.diag = value
        }
    }
}

struct TestPreferenceKeyInRep_Previews: PreviewProvider {
    static var previews: some View {
        TestPreferenceKeyInRep()
    }
}

struct MyUIRep: UIViewRepresentable {
    static var trackingRep: some View {
        MyUIRep().preference(key: MyPrefKey.self, value: 13.31)
    }

    func makeUIView(context: Context) -> UIView {
        return UIView()
    }

    func updateUIView(_ uiView: UIView, context: Context) {
    }

}

struct MyPrefKey : PreferenceKey {
    static var defaultValue: CGFloat = .zero

    static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
        value += nextValue()
    }
}