Сбой Xcode 11 beta 3 при одновременном использовании NavigationLink, @EnvironmentObject и List - PullRequest
4 голосов
/ 03 июля 2019

У меня странный сбой в 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 (как в строке комментария в моем коде).

Тот же код, который использовался в предыдущих бета-версиях.

Ответы [ 2 ]

3 голосов
/ 04 июля 2019

Это ошибка в Xcode 11 beta 3. Вероятно, вернется старое поведение.

С https://developer.apple.com/tutorials/swiftui/handling-user-input по состоянию на 4 июля 2019 года:

Шаг 4

В Xcode 11 beta 3 представление LandmarkDetail не получает автоматического доступа к объекту UserData в среде иерархии представления. Обойти это можно, добавив модификатор environmentObject (_ :) в представление LandmarkDetail.

1 голос
/ 03 июля 2019

Я думаю, что это по замыслу. Когда вы создаете DetailView (), он отключается от иерархии и, следовательно, не наследует ту же среду.

Если вы измените свой ContentView на следующий, он не будет аварийно завершать работу. Кажется, я помню, что у меня была похожая проблема с модалами:


struct ContentView : View {
    @EnvironmentObject var appData: AppData

    var body: some View {
        NavigationView {
            NavigationLink(destination: DetailView().environmentObject(appData) ) {
                Text("link")
            }
        }
    }
}
...