首页 > 解决方案 > 如何显示 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          


      

      
      
      
    }
  }
  
  

  
  
}

标签: iosswiftxcodeswiftui

解决方案


UIHostingController这样的目的,所以你需要注入你的观点,比如

rootViewController = UIHostingController(rootView: WelcomeView())

推荐阅读