SwiftUI:仅在 iOS 14+ 上使用“accessibilityIdentifier”

Posted

技术标签:

【中文标题】SwiftUI:仅在 iOS 14+ 上使用“accessibilityIdentifier”【英文标题】:SwiftUI: use 'accessibilityIdentifier' only on iOS 14+ 【发布时间】:2021-12-09 07:06:06 【问题描述】:

给定以下代码:

struct CopyButtonStyle: ButtonStyle 

    init() 

    func makeBody(configuration: Configuration) -> some View 
        let copyIconSize: CGFloat = 24
        return Image(systemName: "doc.on.doc")
            .renderingMode(.template)
            .resizable()
            .frame(width: copyIconSize, height: copyIconSize)
            .accessibilityIdentifier("copy_button")
            .opacity(configuration.isPressed ? 0.5 : 1)
    

我收到以下错误:

'accessibilityIdentifier' 仅在 ios 14.0 或更新版本中可用 在 iOS 14 上

查看accessibilityIdentifier 声明时,我发现:

public func accessibilityIdentifier(_ identifier: String) -> ModifiedContent<Self, AccessibilityAttachmentModifier>

Xcode 建议包含整个按钮样式结构或至少 makeBody 函数以使其在 iOS 14+ 上可用。

有没有办法创建附加功能,例如:

func addAccessibilityIdentifierIfAvailable(entryParam ??) -> some View

如果accessibilityIdentifier 不可用或类似的,将返回相同的视图,如果可以在该操作系统版本上设置,则返回具有设置标识符的视图。

【问题讨论】:

这是否回答了您的问题***.com/a/63077687/12299030? 是的,我发布了我的解决方案作为答案。谢谢指出! 【参考方案1】:

这里有一个简单的方法:

extension View 
   @ViewBuilder func addAccessibilityIdentifierIfVersionAvailable(identifier: String) -> some View 
        if #available(iOS 14.0, *)  self.accessibilityIdentifier(identifier) 
        else  self  
    

【讨论】:

【参考方案2】:

解决方案之一:

import SwiftUI

/// Adds AccessibilityIdentifier if it's available with the current
/// version of the SwiftUI runtime, returns the same view otherwise
struct AccessibilityIdentifier: ViewModifier 
    private let identifier: String

    /// Adds AccessibilityIdentifier if it's available with the current
    /// version of the SwiftUI runtime, returns the same view otherwise
    /// - Parameter identifier: accessibility identifier, similar to the standard SwiftUI `accessibilityIdentifier`
    init(_ identifier: String) 
        self.identifier = identifier
    

    @ViewBuilder
    func body(content: Content) -> some View 
        if #available(iOS 14.0, macOS 11.0, *) 
            content
                .accessibilityIdentifier(identifier)
         else 
            content
        
    

调用站点:

Text("")
.modifier(AccessibilityIdentifier("text123"))

【讨论】:

以上是关于SwiftUI:仅在 iOS 14+ 上使用“accessibilityIdentifier”的主要内容,如果未能解决你的问题,请参考以下文章

如何在最新的 iOS 14 中仅在 swiftui 中舍入滚动视图的顶角

iOS 14.2 中的 SwiftUI PageTabView 性能问题滞后

SwiftUI 工作表在第一次呈现时被关闭

SwiftUI:在 iOS 14 上点击返回时导航链接崩溃,但在 iOS 13 上没有

如何使 AppStorage 变量仅在 iOS 14 上运行时可用?

按下按钮时 SwiftUI 2.0 iOS 14 Core 数据删除实例