SwiftUI iOS17消除NavigationLink弃用警告并实现按钮导航
直接按以下步骤修改代码即可解决弃用警告,同时保留原有功能:
- 移除弃用的旧代码:删除ZStack中那个带
isActive参数的NavigationLink - 添加正确的导航目标:在
ZStack的修饰符中,和isShowAddNewInvoice对应的导航目标同级,添加BusinessDetails的navigationDestination - 保留原有触发逻辑:按钮和Alert中切换
isShowBusinessDetaisLinkActive的代码无需修改
修改后的完整代码:
import SwiftUI struct Question: View { @EnvironmentObject var invoiceViewModel: InvoiceViewModel @EnvironmentObject var settingsViewModel: SettingViewModel @State private var showingAlert = false var body: some View { NavigationStack{ ZStack { // 已移除弃用的NavigationLink代码 if invoiceViewModel.invoices().count == 0 { // do stuff } else { List{ // show created items } .navigationDestination(isPresented: $invoiceViewModel.isShowInvoiceDetaisLinkActive) { InvoiceDetailView() } } VStack{ if !settingsViewModel.checkBusinessDetailsComplete() { Button(action: { invoiceViewModel.isShowBusinessDetaisLinkActive.toggle() }, label: { BusinessDetailsHeader() .clipShape(RoundedRectangle(cornerRadius: 10)) }) .padding() } Spacer() } } // 新增:添加BusinessDetails的导航目标,与其他导航目标同级 .navigationDestination(isPresented: $invoiceViewModel.isShowBusinessDetaisLinkActive) { BusinessDetails() } .navigationDestination(isPresented: $invoiceViewModel.isShowAddNewInvoice) { AddNewInvoice() } .navigationTitle("Recent Invoices") .toolbar(content: { ToolbarItem(placement: .navigationBarTrailing) { Button{ if !settingsViewModel.checkBusinessDetailsComplete() { showingAlert = true } else { withAnimation{ invoiceViewModel.showAddNewInvoice() } } } label: { Label("Add", systemImage: "plus.circle") } .alert("Complete Your Business Details", isPresented: $showingAlert) { Button("Business Details") { invoiceViewModel.isShowBusinessDetaisLinkActive.toggle() } } } }) } } } #Preview { Question() }
为什么之前尝试无效?
你之前把BusinessDetails的navigationDestination放在了List的修饰符里,但触发导航的按钮和Alert并不属于List的层级。navigationDestination需要挂载在NavigationStack的直接子视图(这里是ZStack)上,才能全局响应对应的布尔值状态变化,确保任何地方切换isShowBusinessDetaisLinkActive都能触发导航。
内容的提问来源于stack exchange,提问作者Mike Haslam
相关产品推荐
相关产品推荐

