SwiftUI实现Toggle Switch报错:向无参数调用传递参数
问题原因&修复方案
这个报错的核心原因是你使用的 Toggle.init(_:sources:isOn:) 初始化器仅支持macOS 13.0+(Ventura)和iOS 16.0+,而你的系统是macOS 12.6.3(Monterey),不符合最低版本要求,所以编译器找不到这个带参数的初始化方法,误判为“向无参数调用传递参数”。
修复方案
方案1:升级系统
直接将macOS升级到13.0或更高版本,之后就能正常使用官方文档里的这个API。
方案2:兼容旧版本的写法
如果不想升级系统,改用兼容macOS 12的Toggle实现方式:
基础绑定写法
如果只是单个开关状态,用最基础的绑定初始化器即可:
@State private var isToggleOn = false var body: some View { Toggle("开关标题", isOn: $isToggleOn) }
多源状态合并(替代sources参数)
如果需要实现类似官方文档中多源状态绑定的逻辑,可以手动合并多个布尔值:
@State private var settingAEnabled = false @State private var settingBEnabled = false // 自定义合并后的状态逻辑(这里以“全部开启”为例,可根据需求修改) private var allSettingsEnabled: Bool { settingAEnabled && settingBEnabled } var body: some View { Toggle("全部开启", isOn: Binding( get: { allSettingsEnabled }, set: { newValue in // 切换时同步更新所有子状态 settingAEnabled = newValue settingBEnabled = newValue } )) }
如果需要监听子状态的自动更新,也可以结合Combine框架实现:
import Combine @State private var settingAEnabled = false @State private var settingBEnabled = false @State private var allSettingsEnabled = false private var cancellables = Set<AnyCancellable>() var body: some View { Toggle("全部开启", isOn: $allSettingsEnabled) .onChange(of: allSettingsEnabled) { newValue in settingAEnabled = newValue settingBEnabled = newValue } .onAppear { // 监听子状态变化,自动更新合并后的状态 Publishers.CombineLatest($settingAEnabled, $settingBEnabled) .map { $0 && $1 } .assign(to: \.allSettingsEnabled, on: self) .store(in: &cancellables) } }
内容的提问来源于stack exchange,提问作者Clara Puglisi
相关产品推荐
相关产品推荐

