Xcode 11 beta 3 在同时使用 NavigationLink、@EnvironmentObject 和 List 时崩溃
Xcode 11 beta 3 crashing when using NavigationLink, @EnvironmentObject and List together
我在 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
也是一样的(就像我代码中的注释行一样)。
以前的测试版中使用的相同代码。
我认为这是设计使然。当您创建 DetailView() 时,它与层次结构断开连接,因此它不会继承相同的环境。
如果您将 ContentView 更改为以下内容,它不会崩溃。我想我记得有一个类似的模态问题:
struct ContentView : View {
@EnvironmentObject var appData: AppData
var body: some View {
NavigationView {
NavigationLink(destination: DetailView().environmentObject(appData) ) {
Text("link")
}
}
}
}
这是 Xcode 11 beta 3 中的错误。旧行为可能会 return。
从 https://developer.apple.com/tutorials/swiftui/handling-user-input 到 2019 年 7 月 4 日:
Step 4
In Xcode 11 beta 3, the LandmarkDetail view doesn’t automatically access the UserData object in the view hierarchy’s environment. The workaround for this is to add the environmentObject(_:) modifier to the LandmarkDetail view.
我在 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
也是一样的(就像我代码中的注释行一样)。
以前的测试版中使用的相同代码。
我认为这是设计使然。当您创建 DetailView() 时,它与层次结构断开连接,因此它不会继承相同的环境。
如果您将 ContentView 更改为以下内容,它不会崩溃。我想我记得有一个类似的模态问题:
struct ContentView : View {
@EnvironmentObject var appData: AppData
var body: some View {
NavigationView {
NavigationLink(destination: DetailView().environmentObject(appData) ) {
Text("link")
}
}
}
}
这是 Xcode 11 beta 3 中的错误。旧行为可能会 return。
从 https://developer.apple.com/tutorials/swiftui/handling-user-input 到 2019 年 7 月 4 日:
Step 4
In Xcode 11 beta 3, the LandmarkDetail view doesn’t automatically access the UserData object in the view hierarchy’s environment. The workaround for this is to add the environmentObject(_:) modifier to the LandmarkDetail view.