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"))