ios - 如何显示 SwiftUI 视图而不是 UIViewController?
问题描述
这里是 X-code 新手,所以请原谅不正确的术语。
在教程中,我尝试用添加到教程中的新 SwiftUI 屏幕替换“屏幕”。
下面是AppController
调用屏幕的完整代码。在标有 X 的块中,您会看到我已注释掉rootViewController = LoginViewController()
以将其替换为rootViewController = WelcomeView()
.
LoginViewController
像这样开始:
import UIKit
import FirebaseAuth
final class LoginViewController: UIViewController {
...
而WelcomeView
像这样开始:
import SwiftUI
struct WelcomeView: View {
...
很明显,我的问题在于旧方式和新 SwiftUI 之间的差异,但我不知道如何以与 UIViewController 类型相同的方式“调用”SwiftUI 的“屏幕”?
我的行上的错误消息是“无法将'WelcomeView'类型的值分配给'UIViewController?'”
import UIKit
import Firebase
final class AppController {
static let shared = AppController()
// swiftlint:disable:next implicitly_unwrapped_optional
private var window: UIWindow!
private var rootViewController: UIViewController? {
didSet {
window.rootViewController = rootViewController
}
}
init() {
NotificationCenter.default.addObserver(
self,
selector: #selector(handleAppState),
name: .AuthStateDidChange,
object: nil)
}
// MARK: - Helpers
func configureFirebase() {
FirebaseApp.configure()
}
func show(in window: UIWindow?) {
guard let window = window else {
fatalError("Cannot layout app with a nil window.")
}
self.window = window
window.tintColor = .primary
window.backgroundColor = .white
handleAppState()
window.makeKeyAndVisible()
}
//xxxxxxxxxxxxxxx - this is where my problem is - xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
@objc private func handleAppState() {
if let user = Auth.auth().currentUser {
let channelsViewController = ChannelsViewController(currentUser: user)
rootViewController = NavigationController(channelsViewController)
} else {
//rootViewController = LoginViewController()
rootViewController = WelcomeView()
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
}
}
解决方案
有UIHostingController
这样的目的,所以你需要注入你的观点,比如
rootViewController = UIHostingController(rootView: WelcomeView())
推荐阅读
- ruby-on-rails - Rspec:如何测试重试?
- laravel - 从中间件中的响应对象获取响应正文
- python - 将烧瓶日志重定向到 Gunicorn 输出
- javascript - HTML5 背景视频无法播放
- c# - MVC Net Core 从多个页面收集数据
- elasticsearch - Elasticsearch 中的复制
- ios - 允许用户使用来自不同视图控制器中的标签的文本创建新的 tableViewCells?
- json - 从 Invoke-RestMethod 访问 JSON 格式的数据
- mysql - MySQL 两种更新方式
- java - Java 指令重新排序示例不起作用