SwiftUI视图截图时EnvironmentObjects失效问题求助
解决SwiftUI截图时EnvironmentObject缺失的崩溃问题
崩溃的核心原因:你调用snapshot()时使用的otherview是全新创建的TestView112实例,它不在原有的视图层级中,无法继承父级注入的GraphObjectRectList环境对象,渲染时自然会触发找不到ObservableObject的致命错误。
解决方法很直接:给要截图的视图手动注入环境对象,具体实现步骤如下:
- 在
TestView111中通过@EnvironmentObject获取已存在的环境对象实例 - 调用
snapshot()前,给要截图的视图添加.environmentObject()修饰符,传入获取到的实例
修改后的代码示例:
//main view struct TestView111: View { @EnvironmentObject private var objRect: GraphObjectRectList // 新增:获取已注入的环境对象 var body: some View { VStack{ otherview Button(action: { // 修改:手动注入环境对象后再执行截图 let image = otherview.environmentObject(objRect).snapshot() UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) }, label: { Text("Save").buttonStyleBlue() }) } } var otherview: some View { TestView112() } } // 其余代码保持不变
如果使用ImageRenderer,同样需要给传入的content手动添加环境对象,示例如下:
Button(action: { let renderer = ImageRenderer(content: otherview.environmentObject(objRect)) if let image = renderer.uiImage { UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) } }, label: { Text("Save").buttonStyleBlue() })
本质上,无论是ImageRenderer还是自定义snapshot扩展,它们渲染的都是脱离原有视图树的新视图实例,必须手动传递所需的环境依赖,才能正常完成渲染。
内容的提问来源于stack exchange,提问作者micah
相关产品推荐
相关产品推荐

