SwiftUI中为HStack调用自定义无障碍设置函数但属性未生效的问题
SwiftUI中为HStack调用自定义无障碍设置函数但属性未生效的问题
嗨,刚接触SwiftUI的话确实容易踩这个坑~你的问题出在自定义扩展里的写法上,SwiftUI的View是值类型,那些accessibility系列修饰符都是返回一个新的View实例,而不是修改原View本身。你现在的代码里用_ =把这些修饰符的返回值直接丢弃了,最后还是返回原来的self,等于根本没把无障碍设置真正应用到View上!
正确的自定义扩展写法应该是这样的:
extension View { func setAccessibility(label: String, identifier: String, ignoreChildren: Bool) -> some View { var modifiedView = self if ignoreChildren { modifiedView = modifiedView.accessibilityElement(children: .ignore) } else { modifiedView = modifiedView.accessibilityElement() } modifiedView = modifiedView.accessibilityIdentifier(identifier) modifiedView = modifiedView.accessibilityLabel(label) return modifiedView } }
或者更符合SwiftUI链式风格的简洁写法(更推荐这种):
extension View { func setAccessibility(label: String, identifier: String, ignoreChildren: Bool) -> some View { self .accessibilityElement(children: ignoreChildren ? .ignore : .include) .accessibilityIdentifier(identifier) .accessibilityLabel(label) } }
调整后的HStack用法(记得把函数调用在HStack的闭包末尾):
var body: some View { ZStack { HStack { Image(.logo) .resizable() .frame(width: UIConsts.logoImageHeight, height: UIConsts.logoImageHeight) Text("Hello") Spacer() Image(.arrowRight) .renderingMode(.template) } .setAccessibility(label: "自定义无障碍标签", identifier: "hello_hstack", ignoreChildren: true) } }
另外要注意:如果ignoreChildren设为true,整个HStack会被识别为一个单独的无障碍元素,子View的无障碍属性会被忽略;如果设为false,则会包含子View的无障碍信息,按需调整即可。
备注:内容来源于stack exchange,提问作者AppleDeveloper
相关产品推荐
相关产品推荐

