如何显示 SwiftUI 视图而不是 UIViewController?
Posted
技术标签:
【中文标题】如何显示 SwiftUI 视图而不是 UIViewController?【英文标题】:How to display a SwiftUI view instead of the UIViewController? 【发布时间】: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”框可能是最简单的 【参考方案1】:UIHostingController
就是为了这个目的,所以你需要注入你的视图,比如
rootViewController = UIHostingController(rootView: WelcomeView())
【讨论】:
谢谢,但我在该行收到相同的错误消息。rootViewController
的类型在这里有问题吗?
你需要在你的 AppController 中导入 SwiftUI 才能使用 UIHostingController,你这样做了吗?
是的,我在其他导入中添加了import SwiftUI
如果您按照提供的方式进行操作,则不能相同,因为现在您将视图控制器分配给视图控制器属性,但在您尝试在那里分配视图之前。请提供如何应用提议的更改的最小可重复示例,以便我可以在本地进行验证。以上是关于如何显示 SwiftUI 视图而不是 UIViewController?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SwiftUI 视图中访问 UIView 子类的属性?
SwiftUI 视图,如 UIKit UIView,如何更改图像的大小
如何在 SwiftUI 中使用 UIViewController 和 UIView?