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

macOS SwiftUI 切换深浅外观后点击按钮其余按钮前景色异常如何解决

这是Xcode 13.x版本SwiftUI的已知Bug,在Playground环境下复现率极高,根本原因是系统对默认按钮的tint颜色状态管理逻辑存在问题,点击任意按钮后会错误修改其他未激活按钮的前景色渲染优先级,最终导致深色模式下未点击按钮显示为异常灰色。

可用解决方案

  • 快速修复:在视图根节点统一添加tint修饰符,使用系统语义色即可自动适配深浅模式,无需手动处理外观切换逻辑,仅需在原有代码的根VStack上添加.tint(.accentColor)即可。也可给每个Button单独添加.foregroundColor(.accentColor)修饰符,手动指定前景色的渲染优先级,避免被系统错误修改。
  • 规避默认样式管理问题:给按钮添加.buttonStyle(.plain)修饰符,之后完全自定义按钮的常态、高亮、点击状态样式,完全脱离系统默认按钮的样式管理逻辑,不会再出现状态混乱的问题。
  • 官方修复:升级到Xcode 14及以上版本,该Bug已经在后续版本的SwiftUI框架中被官方修复,相同代码运行不会再复现异常。

修复后的代码示例

import SwiftUI
import PlaygroundSupport

struct ContentView: View {
    var body: some View {
        VStack {
            HStack {
                Text("Current")
                    .font(.subheadline)
                    .fontWeight(.semibold)
                    .foregroundColor(.gray)
                    .frame(maxWidth: .infinity, alignment: .leading)
                Label("43.672490, -79.388932", systemImage: "location")
                    .frame(width: 175, alignment: .trailing)
            }
            HStack {
                Button {} label: {
                    Text("􀋑 Set Location")
                        .frame(width: 95)
                }
                Spacer()
                Button {} label: {
                    Text("􀋗 Set Travel")
                        .frame(width: 95)
                }
            }
        }
        // 添加此行即可快速修复问题
        .tint(.accentColor)
    }
}

PlaygroundPage.current.setLiveView(ContentView())

内容的提问来源于stack exchange,提问作者swifty-george

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:36:03