在 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
,也一样(如代码中的注释行)。
以前的Beta中使用的相同代码。
答案 0 :(得分:3)
这是Xcode 11 beta 3中的一个错误。旧的行为可能会恢复。
从https://developer.apple.com/tutorials/swiftui/handling-user-input到2019年7月4日:
第4步
在Xcode 11 beta 3中,LandmarkDetail视图不会在视图层次结构的环境中自动访问UserData对象。解决方法是将environmentObject(_ :)修饰符添加到LandmarkDetail视图。
答案 1 :(得分:1)
我认为这是设计使然。创建DetailView()时,它会与层次结构断开连接,因此不会继承相同的环境。
如果将ContentView更改为以下内容,则不会崩溃。我想我记得模态也有类似的问题:
struct ContentView : View {
@EnvironmentObject var appData: AppData
var body: some View {
NavigationView {
NavigationLink(destination: DetailView().environmentObject(appData) ) {
Text("link")
}
}
}
}