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

SwiftUI Picker/Menu组件中选项图片不显示问题排查

问题:Picker/Menu菜单中仅显示已选中的分类图标

创建用于选择ShoppingCategory的Picker(菜单样式)或Menu组件时,打开菜单后仅能看到已选中的图标,其余选项的图标完全不可见,但空白区域仍可点击选择。

原视图代码(Picker版本)

@State private var category: ShoppingCategory? = nil
var body: some View {
            Picker("Category", selection: $category) {
                Image(systemName: "slash.circle")
                    .tag(ShoppingCategory?(nil))
                ForEach(ShoppingCategory.allCases, id: \.self) { category in
                    category.systemImage
                        .resizable()
                        .frame(width: 32)
                        .tag(ShoppingCategory?(category))
                }
            }
            .pickerStyle(.menu)
}

ShoppingCategory枚举代码

enum ShoppingCategory: Int, CaseIterable, Codable {
    case groceries
    case pet
    case restauraunt
    case furniture
    case clothes
    case makeup
    case household
    case toys
    case tech
    case games
    
    var systemImageName: String {
        switch self {
        case .groceries: "carrot"
        case .pet: "pawprint"
        case .restauraunt: "fork.knife"
        case .furniture: "chair.lounge"
        case .clothes: "hanger"
        case .makeup: "sparkles"
        case .household: "house"
        case .toys: "teddybear"
        case .tech: "desktopcomputer"
        case .games: "gamecontroller"
        }
    }

    var systemImage: Image {
        Image(systemName: systemImageName)
    }
}

原视图代码(Menu版本)

Menu {
    Button {
        self.category = nil
    } label: {
        Image(systemName: "slash.circle")
            .resizable()
            .frame(width: 32)
    }
    ForEach(ShoppingCategory.allCases, id: \.self) { category in
        Button {
            self.category = category
        } label: {
            category.systemImage
                .resizable()
                .frame(width: 32)
        }
    }
} label: {
    if let category {
        category.systemImage
    } else {
        Image(systemName: "slash.circle")
    }
}

解决方案

问题根源在于菜单选项中的Image未设置明确的前景色,默认继承了菜单的配色,导致未选中的图标颜色与背景重合,无法显示。只需给菜单内的所有Image添加.foregroundColor(.primary)即可解决:

修复后的Picker代码

@State private var category: ShoppingCategory? = nil
var body: some View {
            Picker("Category", selection: $category) {
                Image(systemName: "slash.circle")
                    .foregroundColor(.primary)
                    .tag(ShoppingCategory?(nil))
                ForEach(ShoppingCategory.allCases, id: \.self) { category in
                    category.systemImage
                        .resizable()
                        .frame(width: 32)
                        .foregroundColor(.primary)
                        .tag(ShoppingCategory?(category))
                }
            }
            .pickerStyle(.menu)
}

修复后的Menu代码

Menu {
    Button {
        self.category = nil
    } label: {
        Image(systemName: "slash.circle")
            .resizable()
            .frame(width: 32)
            .foregroundColor(.primary)
    }
    ForEach(ShoppingCategory.allCases, id: \.self) { category in
        Button {
            self.category = category
        } label: {
            category.systemImage
                .resizable()
                .frame(width: 32)
                .foregroundColor(.primary)
        }
    }
} label: {
    if let category {
        category.systemImage
    } else {
        Image(systemName: "slash.circle")
    }
}

也可以直接修改枚举中的systemImage属性,统一添加前景色,避免重复代码:

var systemImage: Image {
    Image(systemName: systemImageName)
        .foregroundColor(.primary)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:52:48