我在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中使用的代码相同。
这是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视图。