Представление Контроллера Представления Регистрации Перед UITabBarController

Я хочу предоставить контроллер представления входа в систему, чтобы мои пользователи могли проходить проверку подлинности до того, как будут представлены контроллеры панели вкладок. В приведенном ниже коде я получаю сообщение об ошибке "Не удалось преобразовать значение типа" LogInViewController "в" UITabBarController ". Перечислена документация Apple:

При развертывании интерфейса панели вкладок вы должны установить это представление как корневой каталог вашего окна. В отличие от других контроллеров представления, интерфейс панели вкладок никогда не должен устанавливаться как дочерний элемент другого контроллера представления.

Я в тупике, и моя реализация усложняется, когда я распространяю данные ядра по 5 контроллерам представления (например, controller1.coreDataStack = coreDataStack, объявленный как свойство в классе AppDelegate), который является частью контроллера панели вкладок. Могу ли я получить некоторую помощь о том, как я должен перевести пользователя с экрана входа в систему на один из контроллеров представления с вкладками? Любой вклад будет оценен.

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

    // Login View Controller
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let loginVC = storyboard.instantiateViewController(withIdentifier: "loginVC") as! LogInViewController
    self.window?.rootViewController = loginVC

    // TabBar Controller
    let tabController = window!.rootViewController as! UITabBarController
    if let tabViewControllers = tabController.viewControllers {
        // First tab (only one so far...)
        let navController = tabViewControllers[0] as! UINavigationController
        let controller1 = navController.viewControllers.first as! FirstViewController
        controller1.coreDataStack = coreDataStack
    }
}

2 ответа

Решение

Вы получили ошибку, потому что пытаетесь принудительно развернуть LogInViewController в UITabBarController,

Для вашего потока проектирования сохраните loginStatus пользователя в базе данных, проверьте условие перед установкой window.rootViewController, если пользователь logged-in тогда покажи tabControllerиначе покажи LogInViewController,

        let userLogined = GET LOGIN STATUS FROM DATABSE
        if userLogined{
            // Initiate Tabbar Controller object
            let tabController = INITIATE_TABBAR_CONTROLLER
            let tabViewControllers = tabController.viewControllers
            // First tab (only one so far...)
            let navController = tabViewControllers[0] as! UINavigationController
            let controller1 = navController.viewControllers.first as! FirstViewController
            controller1.coreDataStack = coreDataStack
            self.window?.rootViewController = tabController

        }else{
            // Login View Controller
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let loginVC = storyboard.instantiateViewController(withIdentifier: "loginVC") as! LogInViewController
            self.window?.rootViewController = loginVC
        }

Как альтернативный метод, как насчет того, чтобы всегда устанавливать rootViewController в контроллер панели вкладок. Затем, если пользователь вышел из системы, модально представьте контроллер представления входа в систему из контроллера панели вкладок. Как только пользователь успешно вошел в систему, отклоните контроллер представления входа в систему. Я использовал этот метод много раз во многих приложениях.

Другие вопросы по тегам