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

SwiftUI技术问题:如何让List仅点击info图标触发NavigationLink?

解决NavigationStack中List整行触发跳转的问题

SwiftUI的List组件会自动把包含NavigationLink的行整体变成可点击的导航触发区域,这就是你遇到整行都能跳转的原因。下面给你两种可行的解决办法:

办法一:给NavigationLink设置PlainButtonStyle

给NavigationLink添加.buttonStyle(PlainButtonStyle()),可以取消List行的默认导航交互,让只有图标本身可点击:

NavigationStack(path: $navigationPath) {
    List {
        ForEach(aircraftVM.aircraftCollect, id: \.id) { aircraft in
            HStack{
                VStack(alignment: .leading) {
                    Text(aircraft.registration ?? "")
                    Text(aircraft.type ?? "")
                        .font(.callout)
                        .foregroundStyle(.secondary)
                    Text(aircraft.aircraftRemarks ?? "")
                        .font(.footnote)
                        .foregroundStyle(.secondary)
                }
            
                NavigationLink(value: aircraft) {
                    Image(systemName: "info.circle")
                }
                .buttonStyle(PlainButtonStyle()) // 关键代码
            }
        }
        .onDelete(perform: delete)
    }
    .navigationDestination(for: AircraftEntity.self) { aircraft in
        AircraftDatabaseDetailView(aircraft: aircraft)
    }
}

办法二:用Button手动控制导航跳转

如果觉得第一种方式不够灵活,可以改用Button,点击时手动往navigationPath里添加数据,同样能实现只有图标触发跳转:

NavigationStack(path: $navigationPath) {
    List {
        ForEach(aircraftVM.aircraftCollect, id: \.id) { aircraft in
            HStack{
                VStack(alignment: .leading) {
                    Text(aircraft.registration ?? "")
                    Text(aircraft.type ?? "")
                        .font(.callout)
                        .foregroundStyle(.secondary)
                    Text(aircraft.aircraftRemarks ?? "")
                        .font(.footnote)
                        .foregroundStyle(.secondary)
                }
            
                Button(action: {
                    navigationPath.append(aircraft) // 手动添加到导航路径
                }) {
                    Image(systemName: "info.circle")
                }
            }
        }
        .onDelete(perform: delete)
    }
    .navigationDestination(for: AircraftEntity.self) { aircraft in
        AircraftDatabaseDetailView(aircraft: aircraft)
    }
}

这两种方法都能让只有右侧的信息图标触发跳转,List的其他区域不会响应导航动作。

内容的提问来源于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.07 00:52:41