【问题标题】:How to display a SwiftUI view instead of the UIViewController?如何显示 SwiftUI 视图而不是 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”框可能是最简单的

标签: ios swift xcode swiftui


【解决方案1】:

UIHostingController 就是为了这个目的,所以你需要注入你的视图,比如

rootViewController = UIHostingController(rootView: WelcomeView())

【讨论】:

  • 谢谢,但我在该行收到相同的错误消息。 rootViewController 的类型在这里有问题吗?
  • 你需要在你的 AppController 中导入 SwiftUI 才能使用 UIHostingController,你这样做了吗?
  • 是的,我在其他导入中添加了import SwiftUI
  • 如果您按照提供的方式进行操作,则不能相同,因为现在您将视图控制器分配给视图控制器属性,但在您尝试在那里分配视图之前。请提供如何应用提议的更改的最小可重复示例,以便我可以在本地进行验证。
猜你喜欢
  • 2016-07-07
  • 2020-01-17
  • 2020-06-03
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多