如何显示 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 工具栏显示在视图的中心

如何在 SwiftUI 中使用 UIViewController 和 UIView?

SwiftUI:如何根据日期每天显示一个新视图,而以前的视图持续一周

addSubLayer 到 UIView 而不是根视图