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

升级iOS 18与Xcode 16后NavigationLink导航失效问题求助

问题:iOS 18/Xcode 16下嵌套TabView内的NavigationLink无法跳转

App顶部有两个标签页(Tab),每个标签页中展示一组卡片,每张卡片都带有NavigationLink用于跳转至详情视图。将Xcode升级至16、iOS升级至18之后,该功能运行异常,NavigationLink无法再进行跳转。移除NavigationStack内部的TabView后,功能恢复正常。该功能在iOS 17.6版本中可正常运行,特此求助。

示例代码:

TabSelectionView.swift

struct TabSelectionView: View {
    @State var selectedTab: Int = 0
    
    var body: some View {
        ZStack {
            TabView(selection: $selectedTab) {
                ParentView_1()
                    .tabItem {
                        Text("tab1")
                    }
                    .tag(0)
                
                ParentView_2()
                    .tabItem {
                        Text("tab2")
                    }
                    .tag(1)
            }
        }
    }
}

ParentView_1.swift

struct ParentView_1: View {
    @EnvironmentObject var environmentValue: ViewModel
    
    @State var selectedTab: Int = 0
    var body: some View {
        NavigationStack(path: $environmentValue.navigationPath) {
            VStack{
                Text("Parent 1 ")
                
                TabView(selection: $selectedTab) {
                    Child()
                        .tag(0)
                    
                    Child_2()
                        .tag(1)
                }
                .tabViewStyle(.page(indexDisplayMode: .never))
            }
        }
    }
}

ParentView_2.swift

struct ParentView_2: View {
    var body: some View {
        Text("Hello, World!")
    }
}

Child & Child_2.swift

struct Child: View {
    let dummyItems: [ItemModel] = [
        ItemModel(name: "Home", navigateTo: "HomeView"),
        ItemModel(name: "Profile", navigateTo: "ProfileView"),
        ItemModel(name: "Settings", navigateTo: "SettingsView")
    ]
    
    var body: some View {
        VStack{
            
            Text("Child 1")
            
            ScrollView {
                LazyVStack {
                    ForEach(dummyItems.indices, id: \.self) { index in
                        NavigationLink(value: dummyItems[index]) {
                            RoundedRectangle(cornerRadius: 10)
                                .fill(Color.red.opacity(0.2))
                                .frame(width: 300, height: 100)
                                .overlay {
                                    Text("\(dummyItems[index].name)")
                                }
                        }
                    }
                }
            }
            .navigationDestination(for: ItemModel.self) { navigateValue in
                if navigateValue.navigateTo == "HomeView" {
                    DetailView(name: navigateValue.name)
                } else if navigateValue.navigateTo == "ProfileView" {
                    DetailView_2(name: navigateValue.name)
                } else if navigateValue.navigateTo == "SettingsView" {
                    DetailView_2(name: navigateValue.name)
                }
            }
        }
    }
}


struct Child_2: View {
    let dummyItems: [ItemModel] = [
        ItemModel(name: "Home", navigateTo: "HomeView"),
        ItemModel(name: "Profile", navigateTo: "ProfileView"),
        ItemModel(name: "Settings", navigateTo: "SettingsView")
    ]
    
    var body: some View {
        VStack{
            Text("Child 2")
            
            ScrollView {
                LazyVStack {
                    ForEach(dummyItems.indices, id: \.self) { index in
                        NavigationLink(value: dummyItems[index]) {
                            RoundedRectangle(cornerRadius: 10)
                                .fill(Color.yellow.opacity(0.5))
                                .frame(width: 300, height: 100)
                                .overlay {
                                    Text("\(dummyItems[index].name)")
                                }
                        }
                    }
                }
                .navigationDestination(for: ItemModel.self) { navigateValue in
                    if navigateValue.navigateTo == "HomeView" {
                        DetailView(name: navigateValue.name)
                    }
                    else if navigateValue.navigateTo == "ProfileView" {
                        DetailView_2(name: navigateValue.name)
                    }
                    else if navigateValue.navigateTo == "SettingsView" {
                        DetailView_2(name: navigateValue.name)
                    }
                }
            }
        }
    }
}

DetailViews.swift

struct DetailView: View {
    var name: String
    var body: some View {
        VStack{
            Text("detail view \(name)")
        }
    }
}

struct DetailView_2: View {
    var name: String
    var body: some View {
        VStack{
            Text("detail 2 view \(name)")
        }
    }
}

ViewModel.swift

class ViewModel: ObservableObject {
    @Published var navigationPath = NavigationPath()
}

内容的提问来源于stack exchange,提问作者Ranjeet Kumawat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:42:07