SwiftUI-使用'pushViewController'时出现致命错误

时间:2019-08-13 02:01:17

标签: swift uiviewcontroller uinavigationcontroller swiftui pushviewcontroller

因为SwiftUI具有令人窒息的导航系统,所以我试图在我的SwiftUI视图中使用pushViewController

但是,当我运行代码并按下按钮时,出现以下错误-

Fatal error: Unexpectedly found nil while unwrapping an Optional value:
file /Users/.../Conjugate/Conjugate/Pages/Practice/PracticeView.swift, line 93

这是我的代码-

PracticeView.swift

...
Button(action: {    
             /* Line 93 */ UIApplication.shared.windows[0].rootViewController?.navigationController!.pushViewController(UIHostingController(rootView: ResultView()), animated: true)
}) { ... }
...

SceneDelegate.swift

...
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    if let windowScene = scene as? UIWindowScene {
        let window = UIWindow(windowScene: windowScene)

        let nonEmbeddedViewController = UIHostingController(rootView: PracticeView(verb: verbData.shuffled(), numberOfQuestions: CGFloat(verbData.count)))
        let navigationController = UINavigationController(rootViewController: nonEmbeddedViewController)

        window.rootViewController = navigationController

        self.window = window
        window.makeKeyAndVisible()
    }
}
...

有人知道如何解决此问题吗?我怀疑navigationController展开时的值为nil,但是我不知道解决方案。谢谢!

编辑-澄清

我正在尝试制作一个教育性应用程序,让您对某个主题进行测验。用户可以在“练习视图”中回答问题,每当他们按下右下角的按钮(我在我的问题中提到的那个按钮)时,这些问题就会被替换。但是,当所有问题均已回答后,该按钮需要打开另一个视图(“结果视图”),而不仅仅是在当前视图中切换文本。此外,必须在练习视图和结果视图中都隐藏导航栏,而模态表则不会。如果您需要参考,我想Duolingo或this slideshow可能会有用。

1 个答案:

答案 0 :(得分:1)

这不是一个完整的答案,但是代码降价可以帮助您解决这个问题。忽略SwiftUI导航视图,放开一个模型,该模型需要显示(a)练习​​视图(带有一系列问题)或(b)结果。如果您使用以下方法设置模型:

@Published var currentQuestion:Question
@Published var showResults:Bool

(这是很多个伪代码!)

实际上,您可以拥有一个(简单的)内容视图(再次是伪代码):

struct ContentView: View {
    @EnvironmentObject var model: Model

    var body: some View {
        if model.showResults {
            ShowResults()
        } else {
            ShowCurrentQuestion()
        }
    }
}

ShowResultsShowCurrentQuestionViews。您可以在这两者之间进行各种动画处理(默认是淡入/淡出),并且绝对不需要“导航”。只要您的模型驱动 ContentView,它就可以工作。

如果我读错了东西,我将删除或编辑此答案。是的,我并没有解决NavigationView的问题-我在UINavigationController的“老派”中,我正在使用的SwiftUI应用不需要任何类似于push / pop或segues。但是...我使用的是我刚刚描述的内容。)

希望这会有所帮助。