SwiftUI:如何为Modifier添加条件?macOS 11+下.controlSize使用问题
你的代码语法错误在于.controlSize修饰符没有作为Button视图链式调用的一部分,而是被单独放在了if代码块中,SwiftUI不允许这种写法。
以下是两种可行的修复方案:
方案一:使用@ViewBuilder封装按钮视图
这种方式清晰区分不同版本的视图实现,兼容性更好:
@ViewBuilder private var getPinButton: some View { // 定义基础按钮 let baseButton = Button(action: { viewModel.getRoomId() }, label: { Text("Get Pin") .frame(maxWidth: .infinity) .padding(.all) .frame(height: 44) .contentShape(Rectangle()) // 确保整个按钮区域可点击 }) // 根据系统版本应用修饰符 if #available(macOS 11, *) { baseButton.controlSize(.large) } else { baseButton } } // 在视图中直接使用这个按钮 // var body: some View { // getPinButton // }
方案二:自定义ViewModifier实现版本适配
如果需要在多个视图中复用这种版本适配逻辑,可以自定义修饰符:
// 自定义修饰符,仅在macOS 11+应用large控制尺寸 struct LargeControlSizeModifier: ViewModifier { func body(content: Content) -> some View { if #available(macOS 11, *) { content.controlSize(.large) } else { content } } } // 扩展View,方便调用 extension View { func largeControlSizeIfAvailable() -> some View { self.modifier(LargeControlSizeModifier()) } } // 使用方式 Button(action: { viewModel.getRoomId() }, label: { Text("Get Pin") .frame(maxWidth: .infinity) .padding(.all) .frame(height: 44) .contentShape(Rectangle()) // 确保整个按钮区域可点击 }) .largeControlSizeIfAvailable()
两种方案都能实现你需要的效果:仅在macOS 11及以上版本为按钮添加.large控制尺寸,同时保证代码语法正确。
内容的提问来源于stack exchange,提问作者Pastor J.G Seigle
相关产品推荐
相关产品推荐

