Другой вид контроллера дисплея при запуске приложения - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь объяснить ситуацию: у меня есть два контроллера представления: viewHome и viewStartTest. Когда ученик запускает приложение в первый раз, в таблице отсутствуют данные о его тесте. В этой ситуации должен отображаться контроллер ViewStartTest после запуска экрана. Но когда он снова запускает приложение и условие «тест завершен» выполняется, контроллер viewHome должен отображаться при запуске. Я пытаюсь поместить этот код в AppDelegate.swift и имитировать завершенный тест, но все еще не работает, спасибо за помощь:

// 0 - false, 1 - True
var conditionTest = 1

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    if conditionTest == 1 {

        self.window = UIWindow(frame: UIScreen.main.bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let viewStartTest: UIViewController = mainStoryboard.instantiateViewController(withIdentifier: "viewStartTest")
        self.window?.rootViewController = viewStartTest
        self.window?.makeKeyAndVisible()

    } else {

        self.window = UIWindow(frame: UIScreen.main.bounds)
        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let ViewHome: UIViewController = mainStoryboard.instantiateViewController(withIdentifier: "viewHome")
        self.window?.rootViewController = ViewHome
        self.window?.makeKeyAndVisible()
    }
}


Исправьте код делегата сцены после обсуждения ниже:

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).
          if conditionTest == 1 {


        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let viewStartTest: UIViewController = mainStoryboard.instantiateViewController(withIdentifier: "viewStartTest")
        self.window?.rootViewController = viewStartTest
        self.window?.makeKeyAndVisible()

    } else {


        let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let ViewHome: UIViewController = mainStoryboard.instantiateViewController(withIdentifier: "viewHome")
        self.window?.rootViewController = ViewHome
        self.window?.makeKeyAndVisible()
    }
}
        guard let _ = (scene as? UIWindowScene) else { return }
    }

1 Ответ

0 голосов
/ 02 апреля 2020

Вам нужно где-то хранить значение conditionTest. Я бы предложил использовать UserDefaults. Это пример того, как вы могли бы реализовать это:

NavigationController:

class MainNavigationControllerViewController: UINavigationController {

override func viewDidLoad() {
    super.viewDidLoad()

    if isLoggedIn() {
        let homeController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "HomeVC")
        viewControllers = [homeController]
    }
}

fileprivate func isLoggedIn() -> Bool {
    return UserDefaults.standard.isLoggedIn()
}
}

Расширение для пользовательских значений по умолчанию:

extension UserDefaults {

func setIsLoggedIn(value: Bool) {
    set(value, forKey: "isLoggedIn")
    synchronize()
}

func isLoggedIn() -> Bool {
    return bool(forKey: "isLoggedIn")    }
}

Как использовать:

с приведенным выше кодом вы можете просто войти / выйти из системы пользователя. Обязательно позвоните .synchronize()

Логин:

UserDefaults.standard.setIsLoggedIn(value: true)
UserDefaults.standard.synchronize()

Выйти:

UserDefaults.standard.setIsLoggedIn(value: false)
UserDefaults.standard.synchronize()
...