我有这样的视图:
struct MainView: View{
@EnvironmentObject var appModel: AppDataModel
@State var localAppDataModel: AppDataModel! = AppDataModel()
var body: some View{
VStack {
ContentView()
}
Button(action: {
appModel.dismissAR()
},
label: {
Text(LocalizedString.close)
.modifier(VisualEffectRoundedCorner())
})
.environmentObject(localAppDataModel)
.onDisappear{
localAppDataModel.objectCaptureSession?.cancel()
localAppDataModel.photogrammetrySession?.cancel()
localAppDataModel.objectCaptureSession = nil
localAppDataModel.photogrammetrySession = nil
localAppDataModel.scanFolderManager = nil
localAppDataModel.showPreviewModel = false
localAppDataModel.orbit = .orbit1
localAppDataModel.orbitState = .initial
localAppDataModel.isObjectFlipped = false
localAppDataModel = nil
}
}
我用这个函数在
UIKIt
中展示这个视图:
public static func present(viewC: UIViewController){
let controller = UIHostingController(rootView: MainView(appModel: .init()))
mainController = controller
mainController?.modalPresentationStyle = .fullScreen
guard let mainController else { return }
viewC.present(mainController, animated: true, completion: nil)
}
var mainController: UIHostingController<MainView>?
当我解雇时
主视图
public class AppDataModel: ObservableObject, Identifiable {
....
func dismissAR(){
mainController?.dismiss(animated: true)
}
....
}
我的应用程序崩溃了,因为
localAppDataModel
变成了 nil
。如何关闭 MainView 并取消分配/删除 localdaAppDataModel 环境对象?
既然你有一个
ObservableObject
,你可以使用 @StateObject var model = AppDataModel()
它将初始化它一次并在消失时自动取消初始化,包括清除它的所有属性。
仅供参考,如果您决定从
Combine
升级到使用 @Observable
,那么您需要制作一个可选的 @State var model: AppDataModel?
并在 onAppear
中自行初始化,并在 onDisappear
中将其设置为零。付出更多的努力,但您的视图会变得更严格的失效,因为它可以跟踪对象的单个属性而不是整个对象。