Swiftui:如何在navigationTitle上添加无障碍标识符



如何将Accessibility Identifier添加到navigationtitle文本中?我知道对于按钮/文本/图像/堆栈视图,我们可以使用.accessibility(identifier: “some_identifier”)

struct SomeView: View {
var body: some View {
VStack {
Text("Title Text")
.accessibility(identifier: "title")
}
.navigationTitle("title") //How to add accessibilityIdentifier to Navigation bar title?
//.navigationTitle(Text("title").accessibility(identifier: "title"))
}
}

无法添加修饰符到.navigationBarTitle(Text(“title”), displayMode: .inline)。XCUI自动化测试需要可访问性标识符。

我认为这在使用.accessibility(identifier:)的SwiftUI中是不可能的-这可能值得向苹果提交反馈。

但是,您仍然可以通过其标识符访问导航栏-只是默认标识符是文本:

.navigationTitle("title")
let app = XCUIApplication()
app.launch()
assert(app.navigationBars["title"].exists) // true

或者,您可以尝试使用helper扩展(从这里改编)访问UINavigationBar:

struct NavigationBarAccessor: UIViewControllerRepresentable {
var callback: (UINavigationBar?) -> Void
private let proxyController = ViewController()
func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationBarAccessor>) -> UIViewController {
proxyController.callback = callback
return proxyController
}
func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavigationBarAccessor>) {}
typealias UIViewControllerType = UIViewController
private class ViewController: UIViewController {
var callback: (UINavigationBar?) -> Void = { _ in }
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
callback(navigationController?.navigationBar)
}
}
}

现在你可以从SwiftUI视图访问UINavigationBar:

struct ContentView: View {
var body: some View {
NavigationView {
Text("text")
.navigationTitle("title")
.background(
NavigationBarAccessor {
$0?.accessibilityIdentifier = "id123"
}
)
}
}
}

注意,在上面的示例中,您将accessibilityIdentifier设置为UINavigationBar本身,而不是直接设置为标题。

相关内容

  • 没有找到相关文章

最新更新