SwiftUI如何通过扩展为所有Toggle实例统一添加修饰符设置主题色
原有代码无效原因
你写的扩展方法content()不属于SwiftUI组件会自动调用的系统方法,只要你不手动在每个Toggle实例上显式调用.content(),这段tint(.red)的逻辑永远不会执行,自然无法实现全局自动应用样式的效果。
可行实现方案
你可以选下面任意一种方式实现全局Toggle主题色配置:
方案1:通过
UIAppearance全局配置(最省事,零侵入)
在App启动入口处执行如下配置即可,App内所有开关(包括SwiftUI的Toggle和UIKit的UISwitch)都会自动应用对应主题色:@main struct YourApp: App { init() { // 全局配置开关开启状态的主题色 UISwitch.appearance().onTintColor = .red } var body: some Scene { WindowGroup { ContentView() } } }方案2:自定义
ToggleStyle(SwiftUI原生方式,灵活度最高)
先定义带自定义主题色的开关样式,再在根视图全局注入即可,所有子视图的Toggle会默认继承该样式,单独给某个Toggle指定其他样式时会覆盖全局配置:// 自定义主题色开关样式 struct ThemedToggleStyle: ToggleStyle { func makeBody(configuration: Configuration) -> some View { Toggle(configuration) .tint(.red) // 配置自定义主题色 } } // 根视图全局注入样式 @main struct YourApp: App { var body: some Scene { WindowGroup { ContentView() .toggleStyle(ThemedToggleStyle()) } } }
不推荐通过扩展给Toggle加自定义方法的方式实现,这种方式依然需要你在每个Toggle实例上手动调用对应方法,和直接给每个Toggle写
.tint(.red)没有本质区别,达不到全局统一配置的目的。
内容的提问来源于stack exchange,提问作者Joe Scotto
相关产品推荐
相关产品推荐

