如何为SwiftUI视图条件式添加accessibilityAction?
SwiftUI 条件式添加无障碍操作(accessibilityAction)
下面给你几种实用的实现方式,解决无法直接用if语句添加accessibilityAction的问题:
方法1:利用通用.if扩展实现链式条件Modifier
给View添加一个通用扩展,让你可以在Modifier链里直接根据布尔值决定是否应用指定操作:
// 先给View添加通用的.if扩展 extension View { @ViewBuilder func `if`<Content: View>(_ condition: Bool, transform: (Self) -> Content) -> some View { if condition { transform(self) } else { self } } } // 使用示例 @State private var addActionToButton = false Button { print("Button tapped") } label: { Text("Button title") } .if(addActionToButton) { view in view.accessibilityAction(named: "Button action") { print("Button action triggered") } }
方法2:自定义带isEnabled参数的accessibilityAction扩展
仿照accessibilityLabel的设计,给View写一个扩展,让它直接支持启用/禁用开关:
// 自定义扩展 extension View { func accessibilityAction(named name: LocalizedStringKey, isEnabled: Bool, action: @escaping () -> Void) -> some View { modifier(OptionalAccessibilityAction(name: name, isEnabled: isEnabled, action: action)) } } struct OptionalAccessibilityAction: ViewModifier { let name: LocalizedStringKey let isEnabled: Bool let action: () -> Void func body(content: Content) -> some View { isEnabled ? content.accessibilityAction(named: name, action) : content } } // 使用方式和accessibilityLabel完全一致 @State private var addActionToButton = false Button { print("Button tapped") } label: { Text("Button title") } .accessibilityAction(named: "Button action", isEnabled: addActionToButton) { print("Button action triggered") }
方法3:用ViewBuilder包装视图分支
把按钮放在ViewBuilder的条件分支里,根据布尔值生成带/不带无障碍操作的视图:
@State private var addActionToButton = false @ViewBuilder var conditionalButton: some View { let baseButton = Button { print("Button tapped") } label: { Text("Button title") } if addActionToButton { baseButton.accessibilityAction(named: "Button action") { print("Button action triggered") } } else { baseButton } } // 在body中直接使用这个自定义视图 var body: some View { conditionalButton }
内容的提问来源于stack exchange,提问作者Duncan C
相关产品推荐
相关产品推荐

