如何在关闭视图后删除环境对象

问题描述 投票:0回答:1

我有这样的视图:

    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 环境对象?

swiftui uikit environmentobject
1个回答
0
投票

既然你有一个

ObservableObject
,你可以使用
@StateObject var model = AppDataModel()
它将初始化它一次并在消失时自动取消初始化,包括清除它的所有属性。

仅供参考,如果您决定从

Combine
升级到使用
@Observable
,那么您需要制作一个可选的
@State var model: AppDataModel?
并在
onAppear
中自行初始化,并在
onDisappear
中将其设置为零。付出更多的努力,但您的视图会变得更严格的失效,因为它可以跟踪对象的单个属性而不是整个对象。

© www.soinside.com 2019 - 2024. All rights reserved.