我正在体验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")
}
}
如果我注释 @EnvironmentObject var persistence: Persistence
中的SignupView
,则该应用程序可以正常运行,并且模式视图的呈现也可以完美。
相反,如果我将@EnvironmentObject var persistence: Persistence
保留在SignupView
中,但未注释(因此为活动代码),则应用会在启动时崩溃在AppDelegate
中保留任何Stacktrace ... Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
持久性对象的类型为BindableObject
,并且已正确地作为.environmentObject
添加到ContenView
中的SceneDelegate
中。 isLoggedIn
属性设置为false
有什么线索可以说明我是在处理Beta还是实际问题?
答案 0 :(得分:0)
我在SwiftUI中遇到了类似的崩溃,并带有Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
垃圾。
将我的SwiftUI视图从class
转换为struct
进行了修复。
答案 1 :(得分:-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))
)
}
}
我显然也必须为我的.environmentObject
声明SignupView
(模拟SceneDelegate
中为ContentView
做的事情)
但是没有更优雅的方式吗?