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

SwiftUI:NavigationLink使用自定义卡片作为标签出现灰化问题

问题根因

  • NavigationLink默认会将内部标签识别为系统按钮样式,自动应用透明度变化、默认色调渲染效果,覆盖了你自定义的卡片背景样式,最终出现透明度异常的表现。
  • 你将.navigationTitle修饰符错误写在了CityCard子视图内部,该修饰符仅对导航栈管理的页面根视图生效,放在子视图中会引发视图层级属性异常,也可能加重样式渲染的问题。

解决方案

  1. 给NavigationLink添加.buttonStyle(PlainButtonStyle())修饰符,关闭系统默认的按钮样式渲染逻辑,保留你自定义的卡片样式。
  2. 将CityCard中的.navigationTitle移动到导航栈对应的目标视图上,避免无效属性干扰视图渲染。

修改后的参考代码

修正后的CityCard代码

struct CityCard: View {
    var cityData: CityData
    
    var body: some View {
        VStack {
            Text("\(cityData.name)")
                .padding([.top], 10)
            Spacer()
            Image(systemName: cityData.forecastIcon)
                .resizable()
                .frame(width: 45, height: 45)
            Spacer()
            HStack(alignment: .bottom) {
                Text(String(format: "%.2f $", cityData.rate))
                    .padding([.leading, .bottom], 10)
                Spacer()
                Text(String(format: "%.2f °", cityData.degrees))
                    .padding([.trailing, .bottom], 10)
            }
        }
        .frame(width: 150, height: 150)
        .background(Color.blue)
        .cornerRadius(10)
    }
}

修正后的CityList中NavigationLink部分代码

ForEach(self.cities) { item in
    NavigationLink(destination: 
        Text(item.name)
            .navigationTitle(item.name)
        , label: {
        CityCard(cityData: item)
    })
    .buttonStyle(PlainButtonStyle())
}

如果需要保留点击反馈效果,可以自定义按钮样式替换PlainButtonStyle,比如实现点击缩放效果,不会引入透明度异常的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:45:04