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

SwiftUI:点击创建按钮后直接导航至新Flight详情页的实现

解决方案(适配iOS 16+)

针对iOS 16+弃用isActive式NavigationLink的问题,我们可以用NavigationStack的navigationDestination结合绑定值的方式实现跳转,具体修改步骤如下:

  1. 添加跳转控制变量:在FlightsOverView结构体中添加一个@State变量,用来存储要跳转的航班对象:

    @State private var selectedFlight: Flight?
    
  2. 配置导航目标:在NavigationStack内部(列表之后)添加navigationDestination,指定当selectedFlight有值时跳转到详情页:

    .navigationDestination(for: Flight.self) { flight in
        FlightDetailView(flight: flight, viewModel: viewModel)
    }
    
  3. 修改加号按钮逻辑:创建新航班后,将selectedFlight赋值为新航班,触发跳转:

    Button("\(Image(systemName: "plus.app.fill"))", action: {
        let newFlight = viewModel.createNewFlight()
        viewModel.addFlight(flight: newFlight)
        selectedFlight = newFlight // 触发跳转
    })
    
  4. 优化列表项跳转(可选但推荐):原来的列表项用了透明NavigationLink的hack写法,现在可以改成iOS 16+规范的方式,替换原ZStack结构:

    ForEach(viewModel.flights, id: \.id) { flight in
        NavigationLink(value: flight) {
            FlightCell(flight: flight)
                .listRowInsets(EdgeInsets(top: 5, leading: 8, bottom: 5, trailing: 8))
        }
    }
    

修改后的完整代码

struct FlightsOverView: View {
    
    @ObservedObject var viewModel : FlightVM
    @State private var selectedFlight: Flight? // 新增跳转控制变量
    
    var body: some View {
        NavigationStack{
            List {
                // 优化后的列表项跳转
                ForEach(viewModel.flights, id: \.id) { flight in
                    NavigationLink(value: flight) {
                        FlightCell(flight: flight)
                            .listRowInsets(EdgeInsets(top: 5, leading: 8, bottom: 5, trailing: 8))
                    }
                }
                .onDelete(perform: viewModel.removeFlight)
            }
            .listStyle(PlainListStyle())
            .navigationTitle("Flights")
            // 配置导航目标
            .navigationDestination(for: Flight.self) { flight in
                FlightDetailView(flight: flight, viewModel: viewModel)
            }
            .toolbar(content: {
                Button("\(Image(systemName: "plus.app.fill"))", action: {
                    let newFlight = viewModel.createNewFlight()
                    viewModel.addFlight(flight: newFlight)
                    selectedFlight = newFlight // 触发跳转
                })
            })
        }
    }
}

弃用提示翻译

你收到的提示翻译为:

'init(destination:isActive:label:)' 在iOS 16.0中已被弃用:请在NavigationStack或NavigationSplitView内使用NavigationLink(value:label:)

内容的提问来源于stack exchange,提问作者Petr Smejkal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:43:29