【问题标题】:SwiftUI or Beta-State leads to crash?SwiftUI 或 Beta-State 导致崩溃?
【发布时间】:2019-06-21 13:48:55
【问题描述】:

我在使用 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,则应用程序可以正常工作,并且模态视图的显示可以完美运行

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

Persistence Object 的类型为BindableObject,并作为.environmentObject 正确添加到SceneDelegate 中的ContenViewisLoggedIn 属性设置为 false

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

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      嗯,它看起来是由代码错误引起的。如果我按如下方式编写我的 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 所做的事情)

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

      【讨论】:

      • 回答自己的问题很好。但是用不是明确的结论“有没有更优雅的方法”来回答你自己的问题? ?如何为所有这些编辑您的实际问题?请记住两件事:(1)SO是关于问答的,期间。关于成为资源,而不是调试工具。 (2) SwiftUi 刚刚进入 beta 2 - 虽然你在标题中承认了这一点,但你的答案是什么?要求一个更优雅的。拜托,让我们帮助大家。您的答案属于您的问题的一部分。
      • @dfd 添加类似“有没有更优雅的方式?”这样的评论。与不确定性无关——因为我的解决方案确实有效,而且我花了将近一个小时才发现——而是与谦虚(因为你似乎怪异地责怪我)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 2018-01-23
      • 2020-12-02
      相关资源
      最近更新 更多