SwiftUI: используйте accessibilityIdentifier только на iOS 14+

Учитывая следующий код:

      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

При просмотре декларации я обнаружил следующее:

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

Xcode предлагает заключить либо всю структуру стиля кнопки, либо, по крайней мере, makeBody функция, чтобы сделать его доступным на iOS 14+.

Есть ли способ создать дополнительную функцию, например:

      func addAccessibilityIdentifierIfAvailable(entryParam ??) -> some View

или аналогичный, который вернет точно такое же представление, если accessibilityIdentifier недоступен, или вернуть представление с заданным идентификатором, если это возможно установить в этой версии ОС.

2 ответа

Вот простой способ для вас:

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

Одно из решений:

      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"))
Другие вопросы по тегам