因为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可能会有用。
答案 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()
}
}
}
ShowResults
和ShowCurrentQuestion
是Views
。您可以在这两者之间进行各种动画处理(默认是淡入/淡出),并且绝对不需要“导航”。只要您的模型驱动 ContentView
,它就可以工作。
如果我读错了东西,我将删除或编辑此答案。是的,我并没有解决NavigationView
的问题-我在UINavigationController
的“老派”中,我正在使用的SwiftUI应用不需要任何类似于push / pop或segues。但是...我使用的是我刚刚描述的内容。)
希望这会有所帮助。