【问题标题】:Swiftui: How to add Accessibility Identifier on navigationTitleSwiftui:如何在 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 自动化测试需要可访问性标识符。

【问题讨论】:

    标签: ios swift swiftui navigation uikit


    【解决方案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 本身,而不是直接设置为标题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      相关资源
      最近更新 更多