SwiftUI - 使用 'pushViewController' 时出现致命错误
SwiftUI - Fatal Error When Using '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,但我不知道解决方案。谢谢!
编辑 - 澄清
我正在尝试制作一款教育应用程序,针对特定主题对您进行测验。 "practice view" 是用户回答问题的地方,每次他们按下右下角的按钮(我在问题中提到的那个)时,这些问题都会被替换。然而,当所有问题都被回答后,按钮需要打开另一个视图("result view")而不是仅仅切换当前视图中的文本。此外,导航栏必须隐藏在练习视图和结果视图中,而模态表则不行。如果您需要参考,我想 Duolingo 或 this slideshow 可能会有用。
代码降价可能会帮助你。忽略 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
。两者之间可以做各种动画(默认是淡入淡出in/out),绝对不需要“导航”。只要您的型号驱动ContentView
,它就可以工作。
是的,我不是在谈论 NavigationView
- 虽然我在 UINavigationController
方面是“老派”,但我正在开发的 SwiftUI 应用程序不需要任何类似的东西到 push/pop 或 segues。但是...我正在使用我刚才描述的内容。)
因为 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,但我不知道解决方案。谢谢!
编辑 - 澄清
我正在尝试制作一款教育应用程序,针对特定主题对您进行测验。 "practice view" 是用户回答问题的地方,每次他们按下右下角的按钮(我在问题中提到的那个)时,这些问题都会被替换。然而,当所有问题都被回答后,按钮需要打开另一个视图("result view")而不是仅仅切换当前视图中的文本。此外,导航栏必须隐藏在练习视图和结果视图中,而模态表则不行。如果您需要参考,我想 Duolingo 或 this slideshow 可能会有用。
代码降价可能会帮助你。忽略 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
。两者之间可以做各种动画(默认是淡入淡出in/out),绝对不需要“导航”。只要您的型号驱动ContentView
,它就可以工作。
是的,我不是在谈论 NavigationView
- 虽然我在 UINavigationController
方面是“老派”,但我正在开发的 SwiftUI 应用程序不需要任何类似的东西到 push/pop 或 segues。但是...我正在使用我刚才描述的内容。)