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
中的 ContenView
。 isLoggedIn
属性 设置为 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
修复了它。
我在使用 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
中的 ContenView
。 isLoggedIn
属性 设置为 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
修复了它。