如何控制SwiftUI原生macOS列表选中状态的前景色样式
macOS原生SwiftUI List选中状态前景色自定义异常
在原生macOS环境(非Mac Catalyst模式)下运行时,启用选中功能的SwiftUI List存在多个由隐式变量控制的样式状态,这类隐式变量无法直接访问,导致列表内视图自定义的foregroundColor表现异常。结合示例测试,理论上列表项仅存在3种样式状态,但实际测试中Item 2共出现5种可观测的样式状态,具体表现如下:
| 状态 | 前景色 | 背景色 | 截图 |
|---|---|---|---|
| A. Item 2被选中且窗口处于激活状态 | 白色 | Accent(强调色) | ![]() |
| B. Item 2被选中且窗口处于非激活状态 | 黑色 (预期应为淡蓝色) | 灰色 | ![]() |
| C. Item 2未被选中,窗口激活/非激活状态下表现一致 | 蓝色 | 无 | ![]() |
| D. 刚点击Item 2,需等待约300ms才会正式进入选中状态 | 蓝色 (预期应为白色) | Accent(强调色) | ![]() |
| E. Item 2此前为选中状态,点击新项后需等待约300ms新项才正式选中 | 黑色 (预期应为蓝色) | 无 | ![]() |
待解决问题
- 如何控制B、D、E三种状态下的前景色?
- 针对D、E状态:macOS端List的选中逻辑内置了防抖机制,点击列表项后存在约300ms延迟才会正式更新选中状态,是否存在无防抖延迟的
isHighlighted类属性可供调用?系统内置的列表标签使用了这类即时更新的状态属性,未自定义的列表标签颜色会无视防抖延迟,立即在黑/白色之间切换,例如状态E中的Item 1。 - 针对B状态:是否存在
foregroundColor之外的其他颜色修饰符需要使用?
若有相关解决方案建议,非常感谢。
最小可复现示例
运行要求:原生macOS环境,非Mac Catalyst模式
@main struct ExampleApp: App { var body: some Scene { WindowGroup { ContentView() } } } struct ContentView: View { @State private var selected: String? var body: some View { NavigationView { List { NavigationLink(destination: Text("Detail 1"), tag: "1", selection: $selected) { Label("Item 1", systemImage: "tag") } NavigationLink(destination: Text("Detail 2"), tag: "2", selection: $selected) { Label { Text("Item 2") .foregroundColor(selected == "2" ? nil : .blue) } icon: { Image(systemName: "tag") .foregroundColor(selected == "2" ? nil : .blue) } } } .toolbar { Button { } label: { Image(systemName: "sidebar.left") } } } .navigationTitle("Test") .listStyle(.sidebar) } }
上述所有样式状态截图均来自该示例,状态切换动效如下:
内容的提问来源于stack exchange,提问作者Ethan Kay
相关产品推荐
相关产品推荐






