【问题标题】:SwiftUI : Environment Objects not found during UITestSwiftUI:UITest 期间未找到环境对象
【发布时间】:2020-05-03 22:37:52
【问题描述】:

我正在尝试在我的 Xcode 11 项目上运行 UI 测试(以在整个 fastlane 中生成快照),但我面临着一个相当奇怪的情况。

当我运行测试时,应用程序在显示主页后立即崩溃,并出现错误:

Fatal error: No ObservableObject of type TabCommands found. A View.environmentObject(_:) for TabCommands may be missing as an ancestor of this view.: file SwiftUI, line 0

但是在正常运行应用时,我没有这个错误。

这是应用程序的层次结构:

Scene Delegate 使用环境对象构建视图

       let contentView = ContentView()
            .environmentObject(UserManager())
            .environmentObject(TabCommands())
            .environmentObject(IAPStore())


        // Use a UIHostingController as window root view controller.
        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()
        }

内容视图使用基于 UIViewControllerRepresentable 的 TabView:

    var body: some View {

        UIKitTabView([
            UIKitTabView.Tab(view: NavigationView {
                HomeContentView()
                    Spacer()
            }, title: "menu_home".localized(), image: "house"),

            UIKitTabView.Tab(view: NavigationView {
                SearchView()
                    Spacer()
            }, title: "menu_home".localized(), image: "magnifyingglass"),

            UIKitTabView.Tab(view: NavigationView {
                UserTabRootLoading()
                    Spacer()
            }, title: "menu_home".localized(), image: "person.crop.circle"),
        ])
            .edgesIgnoringSafeArea(.bottom)
            .edgesIgnoringSafeArea(.top)
    }

崩溃发生在 SearchView 主体内部,在导航链接中使用 EnvironmentVariable 对象作为isActive 状态(以便稍后在不传递值的情况下弹出 3 个视图)。

struct SearchView: View {

    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    @EnvironmentObject var tabCommands: TabCommands
    @EnvironmentObject var userManager: UserManager

    var body: some View {

        ZStack {
            Color.black.edgesIgnoringSafeArea(.all)

            NavigationLink(destination:  PremiumView()
                                             .navigationBarTitle("")
                                             .navigationBarHidden(true),
                            isActive: self.$tabCommands.isStartPremiumViewActive) {
                    EmptyView()
            }.isDetailLink(false)

       }
}

(我删除了其余代码)

TabCommand 是一个有 6 行的 ObservableObject @Published var myVar = false 同样,当我在模拟器或设备上运行应用程序时,应用程序按预期运行,问题仅在我启动 UI 测试时出现。

当我尝试一个简单的测试时

let app = XCUIApplication()
app.launch()

测试成功。当我添加第一行 app.staticTexts["MainButton"].tap() 时它失败了

场景委托中是否需要进行一些配置以启用环境对象或其他东西?

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    在 SearchView 后面添加 .environmentObject(TabCommands())....以及您在其中使用的所有其他 Environmentobjects...不仅仅是 ContentView。

    像这样:

      UIKitTabView.Tab(view: NavigationView {
                    SearchView().environmentObject(TabCommands())
                        Spacer()
                }, title: "menu_home".localized(), image: "magnifyingglass"),
    

    【讨论】:

    • 好的,谢谢!这是一个快速修复。知道为什么场景委托中使用的环境对象不可用吗?
    • 它们仅适用于您放置环境对象的视图。例外:如果你把环境对象放到导航视图中,所有的子视图都将连接到那个环境对象。
    • 与场景委托无关。问题似乎是传递给UIKitTabView.Tab 的视图(SearchView)没有从其父级继承环境对象。
    猜你喜欢
    • 2017-10-04
    • 2020-08-18
    • 2018-03-06
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 2020-03-07
    相关资源
    最近更新 更多