简体   繁体   English

如何显示 SwiftUI 视图而不是 UIViewController?

[英]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, likeUIHostingController用于此目的,因此您需要注入您的视图,例如

rootViewController = UIHostingController(rootView: WelcomeView())

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM