应用程序使用@Environment(\.dismiss)变量冻结,SwiftUI

ax6ht2ek  于 5个月前  发布在  Swift
关注(0)|答案(1)|浏览(54)

整个应用程序运行良好,代码编译完美,但当我从ServiceListView导航到EmployeeDetailView并按下任何按钮时,CPU将达到100%,应用程序冻结。
这个解决方案SwiftUI NavigationBarItems slideBack freezes app在我的情况下不起作用。
如果我从ServicesListView视图中删除这个@Environment(\.dismiss) private var dismiss,那么代码就可以正常工作。
Similar Question is posted on Apple Forum @Environment(.dismiss)var dismiss -无限循环bug
x1c 0d1x的数据
服务列表视图

struct ServicesListView: AppTNowView {
    
    var services: [Service] = []
    var isAvailableNowView = false
    
    @State private var moveToEmployeeDetail = false
    @State private var isCallingFirstTime = true
    
    @StateObject var viewModel =  ServicesListViewModel()
    @Environment(\.dismiss) private var dismiss
    
    var body: some View {
        ZStack {
            loadView
            LoaderView(isLoading: $viewModel.showLoader)
        }.alert(isPresented: $viewModel.showError, content: {
            Alert(title: Text(viewModel.errorMessage))
        }).onAppear{
            if isCallingFirstTime {
                viewModel.selectedServiceID = services.first?.id ?? 0
                viewModel.selectedService = services.first
                fetchEmployee()
                isCallingFirstTime.toggle()
            }
            
        }.onChange(of: viewModel.selectedServiceID, perform: { newValue in
            debugPrint("Appt: selected index \(newValue)")
            viewModel.selectedServiceID = newValue
            viewModel.selectedService = services.first(where: {$0.id == newValue})
            fetchEmployee()
        })
    }
}

字符串
用于执行到ServiceListView中的导航的代码。

ScrollView {
    if viewModel.employeeList.isEmpty {
        EmptyListView(imageName: ImageName.Home.noEmployee.rawValue, descriptionText: "No Employees available against this service")
            .padding(.top, 50)
    } else {
        VStack {
            ForEach(viewModel.employeeList) { employee in
                NavigationLink {
                    EmployeeDetailView(employee: employee)
                        .hideNavigationBar
                } label: {
                    EmployeeInfoCardView(employee: employee)
                }
            }
        }
    }
}


我的EmployeeDetailView

struct EmployeeDetailView: AppTNowView {
    
    @State private var isCalanderPresented = false
    @StateObject var viewModel = EmployeeDetailViewModle()
    @FocusState private var isMessageFocused: Bool
    @Environment(\.dismiss) private var dismiss
    var employee: Employee
    
    var body: some View {
        ZStack {
            loadView
            LoaderView(isLoading: $viewModel.showLoader)
        }
        .alert(isPresented: $viewModel.showError, content: {
            Alert(title: Text(viewModel.errorMessage))
        })
        .sheet(isPresented: $isCalanderPresented) {
            CalanderView(date: $viewModel.selecteDate, isCalanderPresented: $isCalanderPresented)
                .presentationDetents([.medium, .large])
                .onDisappear {
                    
                }
        }
    }
}

zbwhf8kr

zbwhf8kr1#

不幸的是,您可能需要回退到使用旧的@Environment(\.presentationMode) private var presentationMode在此期间。
自从迁移到NavigationStack以来,我一直在iOS 16/17中遇到同样的问题,我无法确定是什么导致了无限循环。
我有一个工作表,并通过NavigationLink推送几个视图,其中应用程序在呈现第二个连续的NavigationLink时冻结。经典SwiftUI。
另外两种替代方法,如果您省略dismiss并且不想使用presentationMode;
1.如果你可以得到一个对活动视图控制器的引用,你可以直接调用.dismiss(animated: animated)来立即关闭VC
1.如果你想弹出而不是关闭,获取VC的引用并调用let nc = vc?.children.first as? UINavigationController来获取子导航控制器,然后调用nc?.popViewController(animated: true)将其弹出一个视图。

相关问题