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