4

我在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(就像在我的代码中的注释行中)。

以前的测试版中使用的代码相同。

4

2 回答 2

3

这是 Xcode 11 beta 3 中的一个错误。旧的行为可能会恢复。

截至 2019 年 7 月 4 日,来自https://developer.apple.com/tutorials/swiftui/handling-user-input :

第4步

在 Xcode 11 beta 3 中,LandmarkDetail 视图不会自动访问视图层次结构环境中的 UserData 对象。解决方法是将 environmentObject(_:) 修饰符添加到 LandmarkDetail 视图。

于 2019-07-04T14:36:35.897 回答
0

我认为这是设计使然。创建 DetailView() 时,它与层次结构断开连接,因此它不会继承相同的环境。

如果您将 ContentView 更改为以下内容,它不会崩溃。我想我记得有一个类似的模态问题:


struct ContentView : View {
    @EnvironmentObject var appData: AppData

    var body: some View {
        NavigationView {
            NavigationLink(destination: DetailView().environmentObject(appData) ) {
                Text("link")
            }
        }
    }
}
于 2019-07-03T16:26:48.870 回答