如何将EnvironmentObject传递给UIViewRepresentable的Coordinator?
解决UIViewRepresentable中传递EnvironmentObject给Coordinator的问题
你要把ToolbarModel这个EnvironmentObject传给DrawingUI,并在Coordinator里更新它的selectedUIColor属性,现在纠结两个标注!!!!的位置该填什么,直接给你解决方案:
步骤1:删掉多余的代码
首先把DrawingUI结构体里的这行代码删掉:
let coordinator = Coordinator(!!!!!)
这行完全没必要,UIViewRepresentable规定通过makeCoordinator()方法创建Coordinator实例,不需要提前定义这个常量。
步骤2:在makeCoordinator里传递EnvironmentObject
把makeCoordinator()方法里的!!!!替换成当前结构体中已有的toolbarModel,代码改成这样:
func makeCoordinator() -> Coordinator { return Coordinator(toolbarModel) }
因为DrawingUI已经通过@EnvironmentObject拿到了toolbarModel,直接把它传给Coordinator的初始化方法就行。
额外优化:去掉冗余属性
你在Coordinator里重复定义了selectedUIColor,其实可以直接复用toolbarModel的属性,减少冗余代码。调整后的Coordinator代码如下:
class Coordinator: NSObject, PKToolPickerObserver { private var toolbarModel: ToolbarModel // 直接绑定toolbarModel的属性,读写都会同步到环境对象 var selectedUIColor: UIColor { get { toolbarModel.selectedUIColor } set { toolbarModel.selectedUIColor = newValue } } init(_ toolbarModel: ToolbarModel) { self.toolbarModel = toolbarModel } // 你的PKToolPickerObserver实现代码... }
这样处理后,Coordinator就能正常更新toolbarModel的属性,并且变更会自动同步到整个SwiftUI环境中。
内容的提问来源于stack exchange,提问作者Duck
相关产品推荐
相关产品推荐

