我想将环境对象传递给UIViewRepresentable
这样的:
DrawingUI()
.environmentObject(toolbarModel)
它toolbarModel
有一个名为的属性selectedUIColor
,我需要UIViewRepresentable
更新它。
然后我有这个:
struct DrawingUI: UIViewRepresentable {
@EnvironmentObject private var toolbarModel:ToolbarModel
...
let coordinator = Coordinator(!!!!!)
class Coordinator: NSObject, PKToolPickerObserver {
// for some reason I have to have this property
// again because I did not find a way to set the
// same property outside the coordinator
private var toolbarModel:ToolbarModel
private var selectedUIColor:UIColor {
didSet {
toolbarModel.selectedUIColor = selectedUIColor
}
}
init(_ toolbarModel:ToolbarModel) {
self.toolbarModel = toolbarModel
}
...
func makeCoordinator() -> PencilKitSwiftUI.Coordinator {
return Coordinator(!!!!!)
}
我的问题是:我应该在零件上放什么!!!!!
?
在 SwiftUI 中,你应该只传入
View
/UIViewRepresentable
结构体完成其工作所需的内容(而不是整个对象)。对于你需要的读/写访问权限@Binding var
,请尝试将其更改为:您尝试传递到 DrawingUI 视图中的 ToolbarModel 实例必须使用适当的环境对象上下文进行初始化,以便在 UIViewRepresentable 中正确利用其属性。代码片段中的“!!!”表示应实例化或提供 ToolbarModel 的位置。由于使用了 @EnvironmentObject,因此需要将 ToolbarModel 作为 DrawingUI 中的 makeUIView() 或 prepare() 方法的一部分进行创建,以确保在呈现给视图时正确更新。问题似乎是关于如何正确初始化 ToolbarModel。解决方案:Swift struct DrawingUI: UIViewRepresentable { @ObservedObject private var ToolbarModel: ToolbarModel // 假设它是一个可观察对象,以便清晰起见
func makeUIView(context: Context) -> UIView { // 在这里使用你的绘图 UI 设置
toolbarModel
}
uiView
func updateUIView(_ uiView: UIView, context: Context) { //根据更改更新内部的任何视图toolbarModel
}
func makeContext() -> Context { return Context() } // 如果需要,可以用特定的初始化程序替换它。
// 确保
toolbarModel
在使用前已初始化: init() { self.toolbarModel = ToolbarModel(initialValue: ...)// 使用必要的值进行初始化 } } 说明:重新初始化:确保toolbarModel 已正确初始化并连接到环境上下文。如果它是一个 ObservableObject,请考虑直接在 DrawingUI 的 init() 方法中初始化它,或者根据 Swift 版本(makeContext())通过另一个构造函数路径创建它。访问toolbarModel:在 makeUIView() 函数中,如上所示访问toolbarModel(例如,self.toolbarModel)。确保任何修改都通过 updateUIView() 方法反映回您的模型。更新视图:在 updateUIView() 中,确保 UIView 实例中的任何视觉更改都链接回toolbarModel。这可能涉及 YourDrawingView 方法中的自定义更新,例如可以处理颜色变化的 updateWith(_:)。环境对象生命周期:请记住,@EnvironmentObject 对象管理自己的生命周期,当它们由于外部因素(例如,在您的情况下,在工具栏模型本身内)而发生变化时,会自动更新。您通常不需要手动管理此生命周期。相关问题:如何在自定义 ViewModel(如 ToolbarModel)和 SwiftUI View(如 DrawingUI)之间高效同步数据,而无需 ViewModel 的冗余副本?可能的答案格式:解释如何使用 SwiftUI 中的 @Published 或 @Binding 来促进 ViewModel 和 View 之间的同步。讨论在 SwiftUI 应用程序内管理反应式架构中数据流的最佳实践。提及可以增强 SwiftUI 中数据绑定的工具或模式,例如 RxSwift、Combine 或 Observables。