SwiftUI 或 Beta-State 导致崩溃?

SwiftUI or Beta-State leads to crash?

我在使用 SwiftUI 和 xCode 11 Beta 2 时遇到了奇怪的行为,我想知道它是否与错误的代码或 beta 状态有关。我有以下代码:

import SwiftUI
import Combine

struct ContentView : View {

    @EnvironmentObject var persistence: Persistence

    var modal = Modal(SignupView())

    var body: some View {
        VStack {
            Text("Hello \(persistence.userNickname)")
            Button(action: {
                self.persistence.isLoggedIn.toggle()
            }) {
                Text("Swap")
            }
            }.presentation(persistence.isLoggedIn ? nil : modal)
    }
}


struct SignupView: View {

    @EnvironmentObject var persistence: Persistence

    var body: some View {
        Text("Please Login")
    }

}

如果我 注释掉 SignupView 中的 @EnvironmentObject var persistence: Persistence,应用程序可以正常工作,模态视图的呈现 可以完美运行

相比之下,如果我在 SignupView 中保留 @EnvironmentObject var persistence: Persistence 未注释 (因此作为活动代码), 应用程序崩溃AppDelegate 某处启动时没有留下任何 Stacktrace... Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

持久性对象的类型为 BindableObject,并作为 .environmentObject 正确添加到 SceneDelegate 中的 ContenViewisLoggedIn 属性 设置为 false

知道我是在处理 Beta 版还是真正的问题吗?

嗯,看来这是代码错误造成的。如果我按如下方式编写 ContentView,它会起作用:

struct ContentView : View {

    @EnvironmentObject var persistence: Persistence

    var body: some View {
        VStack {
            Text("Hello \(persistence.userNickname)")
            Button(action: {
                self.persistence.isLoggedIn.toggle()
            }) {
                Text("Swap")
            }
            }.presentation(persistence.isLoggedIn ? nil :
                Modal(SignupView().environmentObject(persistence))
        )
    }
}

我显然也必须为我的 SignupView 声明 .environmentObject(模拟在 SceneDelegate 中为 ContentView 所做的)

但是有没有更优雅的方式呢?

我在 SwiftUI 中遇到了类似的崩溃,这个 Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 垃圾。

将我的 SwiftUI 视图从 class 转换为 struct 修复了它。