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

SwiftUI中Navigation Link失效,点击单元格无法跳转至详情页

问题:列表单元格NavigationLink点击无法跳转至详情页

我希望用户点击列表单元格时跳转至详情页,但当前NavigationLink处于禁用状态,点击对应单元格无法完成页面跳转。

相关代码

ContentView代码

struct ContentView: View {
    @EnvironmentObject private var viewModel: FruitListViewModel

    var body: some View {
        VStack {
            Text("Fruit List ")
                .font(.largeTitle)
            List {
                ForEach(viewModel.fruits) { fruit in
                    
                    NavigationLink(destination: FruitDetailsView(fruit: fruit)) {
                        RowView(name: fruit.name, genus: fruit.genus, family: fruit.family)
                    }
                }
            }
        }
        .onAppear {
            viewModel.fetchFruit()
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

RowView代码

import SwiftUI

struct RowView: View {
    let name: String
    let genus: String
    let family: String

    var body: some View {
        VStack(alignment: .leading) {
            HeadTitleView(name: name)
            Text("Genus: \(genus)")
            Text("family:\(family)")
            Spacer()
        }
    }
}
struct RowView_Previews: PreviewProvider {
    static var previews: some View {
        RowView(name: "Apple", genus: "Apple", family: "Appicote")
    }
}

FruitDetailsView代码

import SwiftUI

struct FruitDetailsView: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    @State private var name: String = ""
    @State private var genus: String = ""
    @State private var family: String = ""

    let fruit: Fruits

    var body: some View {
        VStack(alignment: .center, spacing: 5) {
            Text("Name: \(fruit.name)")
                .foregroundColor(Color.gray)
            Text("Genus: \(fruit.genus)")
                .foregroundColor(Color.gray)
            Text("Family: \(fruit.family)")
                .foregroundColor(Color.gray).padding(50)
        }.onAppear(perform: {
            name = fruit.name
            genus = fruit.genus
            family = fruit.family
        }).padding(20)
    }
}

界面截图

列表界面截图


解决方案

核心问题原因

NavigationLink 必须在 NavigationView 的层级结构内才能正常触发页面跳转逻辑,原代码中 ContentView 未使用 NavigationView 包裹,导致 NavigationLink 处于禁用状态无法响应点击。

修改后的代码

1. 给ContentView添加NavigationView包裹

struct ContentView: View {
    @EnvironmentObject private var viewModel: FruitListViewModel

    var body: some View {
        NavigationView {
            VStack {
                Text("Fruit List ")
                    .font(.largeTitle)
                List {
                    ForEach(viewModel.fruits) { fruit in
                        NavigationLink(destination: FruitDetailsView(fruit: fruit)) {
                            RowView(name: fruit.name, genus: fruit.genus, family: fruit.family)
                        }
                    }
                }
            }
        }
        .onAppear {
            viewModel.fetchFruit()
        }
    }
}

2. 优化FruitDetailsView(移除冗余State变量)

原代码中@State变量属于冗余定义,直接使用传入的fruit属性即可:

struct FruitDetailsView: View {
    @Environment(\.presentationMode) var presentationMode
    let fruit: Fruits

    var body: some View {
        VStack(alignment: .center, spacing: 5) {
            Text("Name: \(fruit.name)")
                .foregroundColor(.gray)
            Text("Genus: \(fruit.genus)")
                .foregroundColor(.gray)
            Text("Family: \(fruit.family)")
                .foregroundColor(.gray)
                .padding(50)
        }
        .padding(20)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:25:14