我认为这在 SwiftUI 中使用 .accessibility(identifier:) 是不可能的 - 可能值得向 Apple 提交反馈。
但是,您仍然可以通过其标识符访问导航栏 - 只是默认标识符是文本:
.navigationTitle("title")
let app = XCUIApplication()
app.launch()
assert(app.navigationBars["title"].exists) // true
或者,您可以尝试使用辅助扩展(改编自here)访问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 本身,而不是直接设置为标题。