You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI iOS17消除NavigationLink弃用警告并实现按钮导航

直接按以下步骤修改代码即可解决弃用警告,同时保留原有功能:

  1. 移除弃用的旧代码:删除ZStack中那个带isActive参数的NavigationLink
  2. 添加正确的导航目标:在ZStack的修饰符中,和isShowAddNewInvoice对应的导航目标同级,添加BusinessDetails的navigationDestination
  3. 保留原有触发逻辑:按钮和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 12:48:22