Swiftui:如何在 navigationTitle 上添加辅助功能标识符

Posted

技术标签:

【中文标题】Swiftui:如何在 navigationTitle 上添加辅助功能标识符【英文标题】:Swiftui: How to add Accessibility Identifier on navigationTitle 【发布时间】:2021-05-15 21:32:13 【问题描述】:

我们如何将Accessibility Identifier 添加到 NaviagationTitle 文本中。我知道对于按钮/文本/图像/堆栈视图,我们可以使用 .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 自动化测试需要可访问性标识符。

【问题讨论】:

【参考方案1】:

我认为这在 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 本身,而不是直接设置为标题。

【讨论】:

以上是关于Swiftui:如何在 navigationTitle 上添加辅助功能标识符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中使用 Realm

如何在 UIkit 中添加 SwiftUI 对象

如何使用 SwiftUI 在 UICollectionViewCell 中填充内容

如何在 SwiftUI 中创建指数

如何在 SwiftUI 的 ScrollView 中制作动画? SwiftUI 中的手风琴风格动画

如何在 SwiftUI 中停止 Animation().repeatForever