SwiftUI:点击创建按钮后直接导航至新Flight详情页的实现
解决方案(适配iOS 16+)
针对iOS 16+弃用isActive式NavigationLink的问题,我们可以用NavigationStack的navigationDestination结合绑定值的方式实现跳转,具体修改步骤如下:
添加跳转控制变量:在
FlightsOverView结构体中添加一个@State变量,用来存储要跳转的航班对象:@State private var selectedFlight: Flight?配置导航目标:在
NavigationStack内部(列表之后)添加navigationDestination,指定当selectedFlight有值时跳转到详情页:.navigationDestination(for: Flight.self) { flight in FlightDetailView(flight: flight, viewModel: viewModel) }修改加号按钮逻辑:创建新航班后,将
selectedFlight赋值为新航班,触发跳转:Button("\(Image(systemName: "plus.app.fill"))", action: { let newFlight = viewModel.createNewFlight() viewModel.addFlight(flight: newFlight) selectedFlight = newFlight // 触发跳转 })优化列表项跳转(可选但推荐):原来的列表项用了透明
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
相关产品推荐
相关产品推荐

