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