[英]How to display a SwiftUI view instead of the UIViewController?
Total X-code newbie here so pls forgive the incorrect terminology.这里是 X 代码的新手,所以请原谅不正确的术语。
In a tutorial, I'm trying to replace a "screen" with a new SwiftUI screen that I've added to the tutorial.在教程中,我尝试用添加到教程中的新屏幕 SwiftUI 替换“屏幕”。
Below is the full code of AppController
which calls the screens.下面是调用屏幕的
AppController
的完整代码。 In the block marked with the X's, you will see that I've commented out rootViewController = LoginViewController()
to replace it with rootViewController = WelcomeView()
.在标有 X 的块中,您会看到我已注释掉
rootViewController = LoginViewController()
以将其替换为rootViewController = WelcomeView()
。
LoginViewController
starts like this: LoginViewController
是这样启动的:
import UIKit
import FirebaseAuth
final class LoginViewController: UIViewController {
...
Whereas WelcomeView
starts like this:而
WelcomeView
是这样开始的:
import SwiftUI
struct WelcomeView: View {
...
So obviously, my problem is lies in the differences between the old ways and the new SwiftUI, but I'm lost as to how to "call" a "screen" that is SwiftUI in the same way that you do a UIViewController type?很明显,我的问题在于旧方法和新方法 SwiftUI 之间的差异,但我不知道如何以与 UIViewController 类型相同的方式“调用”SwiftUI 的“屏幕”?
The error message on my line is "Cannot assign value of type 'WelcomeView' to type 'UIViewController?'"我的行上的错误消息是“无法将类型‘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
}
}
}
There is UIHostingController
for such purpose, so you need to inject your view, like有
UIHostingController
用于此目的,因此您需要注入您的视图,例如
rootViewController = UIHostingController(rootView: WelcomeView())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.