如何在下载后仅在Swift中显示ViewController?

How to show a ViewController in Swift only ones after downloading?

我正在创建一个具有入职培训功能的应用程序。此入职培训在 ViewController 上进行,只有这个特定目的,这就是为什么我只希望 ViewController 在下载应用程序后显示。(主应用程序仅包含一个 ViewController)

这是我到目前为止所做的:

1) 我删除了故事板文件中的故事板入口点

2) 为两个 ViewController

输入了故事板 ID

3) 在 AppDelegate 文件中编码,载入 ViewContoller 仅应在下载后第一次出现

我的问题:运行模拟器上的应用程序只显示黑屏

我已经确定标识符和故事板的名称是正确的。

(在我的 AppDelegate.swift 文件下方)

import UIKit
import Firebase
import FirebaseDatabase
import paper_onboarding


@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate {


    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.


        FirebaseApp.configure()


        window = UIWindow(frame: UIScreen.main.bounds)

        let sb = UIStoryboard(name: "Main", bundle: nil)
        var initialViewController = sb.instantiateViewController(withIdentifier: "Onboarding")



        let userDefaults = UserDefaults.standard

         if userDefaults.bool(forKey: "onboardingComplete") {
           initialViewController = sb.instantiateViewController(withIdentifier: "MainApp")
          }


        window?.rootViewController = initialViewController
        window?.makeKeyAndVisible()




        return true

    }

    // MARK: UISceneSession Lifecycle

    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }


}
``




对于黑屏:

您是否检查了项目目标的 General 选项卡中的 MAIN INERFACE?它应该设置为从下拉列表中选择的故事板之一。还要检查 Launch Screen File 是否选择了 LaunchScreen 或任何其他所需的故事板。

对于作为第一个视图的入职:

主界面应提供给载入视图控制器所在的故事板,然后将该视图指定为初始视图控制器。

如果您不明白其中的逻辑,请告诉我。

这个问题的解决方法不是使用AppDelegate.swift文件,而是使用SceneDelegate.swift文件。

在我的 SceneDelegate.swift 文件下面

import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?


    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see`application:configurationForConnectingSceneSession` instead).

        let sb = UIStoryboard(name: "Main", bundle: nil)
        var initialViewController = sb.instantiateViewController(withIdentifier: "Onboarding")


        let userDefaults = UserDefaults.standard

                if userDefaults.bool(forKey: "onboardingComplete") {
                   initialViewController = sb.instantiateViewController(withIdentifier: "MainApp")
                 }




        if let windowScene = scene as? UIWindowScene {

            let window = UIWindow(windowScene: windowScene)
             window.rootViewController = initialViewController
             self.window = window
            window.makeKeyAndVisible()
         }




        guard let _ = (scene as? UIWindowScene) else { return }
    }

    func sceneDidDisconnect(_ scene: UIScene) {
        // Called as the scene is being released by the system.
        // This occurs shortly after the scene enters the background, or when its session is discarded.
        // Release any resources associated with this scene that can be re-created the next time the scene connects.
        // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
    }

    func sceneDidBecomeActive(_ scene: UIScene) {
        // Called when the scene has moved from an inactive state to an active state.
        // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
    }

    func sceneWillResignActive(_ scene: UIScene) {
        // Called when the scene will move from an active state to an inactive state.
        // This may occur due to temporary interruptions (ex. an incoming phone call).
    }

    func sceneWillEnterForeground(_ scene: UIScene) {
        // Called as the scene transitions from the background to the foreground.
        // Use this method to undo the changes made on entering the background.
    }

    func sceneDidEnterBackground(_ scene: UIScene) {
        // Called as the scene transitions from the foreground to the background.
        // Use this method to save data, release shared resources, and store enough scene-specific state information
        // to restore the scene back to its current state.
    }


}