Xcode 11 beta 3 在同时使用 NavigationLink、@EnvironmentObject 和 List 时崩溃

Posted

技术标签:

【中文标题】Xcode 11 beta 3 在同时使用 NavigationLink、@EnvironmentObject 和 List 时崩溃【英文标题】:Xcode 11 beta 3 crashing when using NavigationLink, @EnvironmentObject and List together 【发布时间】:2019-07-03 13:52:18 【问题描述】:

我在 SwiftUI / Xcode 11 beta 3 中遇到了一个奇怪的崩溃,代码如下所示(我只保留了最低限度来显示该行为):

import SwiftUI
import Combine

final class AppData: BindableObject  
    let didChange = PassthroughSubject<AppData, Never>()

    init()  


struct ContentView : View 
    var body: some View 
        NavigationView 
            NavigationLink(destination: DetailView() ) 
                Text("link")
            
        
    


struct DetailView : View 
    @EnvironmentObject var appData: AppData
//  @ObjectBinding var appData = AppData() -> Works 

    var body: some View 
        List 
            Text("A")
            Text("B")
            Text("C")
        
    


BindableObject 像这样被注入SceneDelegate.swift

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

当关注NavigationLink 时,它会因

而崩溃

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

如果我从详细视图中删除 List 视图,它可以正常工作。如果我改用 @ObjectBinding 也是一样的(就像在我的代码中的注释行中一样)。

以前的测试版中使用的代码相同。

【问题讨论】:

我遇到了同样类型的崩溃。这是来自控制台的部分错误消息:错误:模块导入失败:无效令牌(rlm_lldb.py,第 37 行)文件“temp.py”,第 1 行,在 dyld:未找到符号:_$s7SwiftUI14NavigationLinkVyxGAA4ViewAAMc 引用from: ...(它从那里继续引用路径等。 您的设备升级到 beta 3 了吗? @Jake : 这是模拟器 【参考方案1】:

这是 Xcode 11 beta 3 中的一个错误。旧的行为可能会恢复。

截至 2019 年 7 月 4 日,来自https://developer.apple.com/tutorials/swiftui/handling-user-input:

第四步

在 Xcode 11 beta 3 中,LandmarkDetail 视图不会自动访问视图层次结构环境中的 UserData 对象。解决方法是将 environmentObject(_:) 修饰符添加到 LandmarkDetail 视图。

【讨论】:

【参考方案2】:

我认为这是设计使然。创建 DetailView() 时,它与层次结构断开连接,因此不会继承相同的环境。

如果您将 ContentView 更改为以下内容,它不会崩溃。我想我记得有一个类似的模态问题:


struct ContentView : View 
    @EnvironmentObject var appData: AppData

    var body: some View 
        NavigationView 
            NavigationLink(destination: DetailView().environmentObject(appData) ) 
                Text("link")
            
        
    

【讨论】:

那么@EnvironmentObject 的目的是什么?如果我必须将它显式传递给我导航到的每个视图,为什么不使用普通参数(@binding 或不使用)? 好吧,不是 所有 视图。只有像 DetailView 和其他一些情况,对于大多数人来说,@EnvironmentObject 仍然可以发挥作用。 我想我们可以同意,在 DetailView 创建的时候,因为它没有父级,它不能继承一个环境。有争议的是 SwiftUI 是否应该在将环境插入(呈现)到层次结构中时自动附加环境。我认为它不应该,否则它可能会覆盖您可能设置的特定环境。我认为 SwiftUI 只是一个警告,如果你想让它继承环境,你必须自己做。这是我的意见,我没有在任何地方读过。 我明白你的意思,虽然我不同意 :-) 如果我想通过我的应用程序“手动”创建数据流,我会在视图的初始化程序中使用普通参数。环境应该随处可访问,就像在 beta 1 和 2 中所做的那样。 你确定它在 beta 1 和 2 中是这样工作的吗?我记得至少一周前遇到过这个问题。

以上是关于Xcode 11 beta 3 在同时使用 NavigationLink、@EnvironmentObject 和 List 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 11 beta 3 上 UIAction 的语法

安装 Xcode 9.0 Beta 后 Xcode 8.3.2 中缺少模拟器

我升级到“Xcode 11 Beta 3”,它只引入“Create ML”(版本 1),没有显示“活动”分类器模型?

xcodebuild 在 Xcode 11 beta 上挂起,在 Xcode 10 上成功

使用 Alamofire Swift 3 和 Xcode 8 beta 解析 JSON 没有数据

未找到 SwiftUI 符号:_$s7SwiftUI9TextFieldVAA4ViewAAMc Xcode 11 beta 3