【发布时间】:2021-09-28 10:40:31
【问题描述】:
这里是 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
}
}
}
【问题讨论】:
-
创建一个新项目并选中“SwiftUI”框可能是最简单的