Как раскрутиться через программную установку rootV C (tabViewController) с дочерней вкладки на другой V C, который не был создан - PullRequest
0 голосов
/ 11 июля 2020

Swift 5 / xCode 11.5

При запуске приложения App Delegate проверит наличие сохраненного токена аутентификации на телефоне пользователя. Если его нет, он будет отображать, что такое InitialViewController (создание его экземпляра, установка его как rootViewController и отображение в окне). Если токен присутствует, он создаст экземпляр и установит MainTabController как rootV C и отобразит его. Иерархия выглядит так:

RegisterViewController <-> (между ними нет навигационных контроллеров) InitialViewController <-> LoginViewController Все вышеперечисленные контроллеры от sh до MainTabController в случае успешного входа в систему или регистрации при условии, что токен авторизации для пользователя отсутствует на телефоне (нет навигационных контроллеров между любыми из этих «представлений», просто нажатие / отклонение.). MainTabController имеет три вкладки, которые представляют собой UIViewController, подключенные через NavControllers.

Поскольку rootV C создается и отображается программно через объект Window в AppDelegate, InitialViewController является недоступен для раскрутки с вкладки на MainTabController (который был установлен как rootV C), если у пользователя действительно есть сохраненный токен аутентификации.

Моя работа заключалась в удалении токен аутентификации затем вызывает функцию в AppDelegate, которая переключит rootViewController и отобразит его в окне (обратно к InitialViewController ). Я беспокоюсь обо всех других V C, которые были созданы, и это может вызвать скопление памяти. Все ли дочерние элементы MainTabController деактивируются, когда я это делаю? Вот код для действия выхода и переключения rootV C:

выхода

@IBAction func logout(_ sender: Any) {
        
        UserServices.logoutUser() {
            responseResult in
            if responseResult == .Success {
                CommonUtils.clearAuthToken()
                CommonUtils.clearAllUserDefaultData()
                let appDelegate = UIApplication.shared.delegate as! AppDelegate
                appDelegate.switchRootViewController()
            } else {
                self.showAlert(title: "Error", message: responseResult.rawValue)
            }
        }
}

switchRootViewController в AppDelegate

func switchRootViewController() -> Void {
        let rootController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "InitialViewController")
        self.window?.rootViewController = rootController
    }

То, что я пробовал с переходом отмотки уже (внутри действия выхода из системы)

        let initialController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "InitialViewController")
        initialController.addChild(self) // self is tab VC I'm trying to unwind from
        let children = initialController.children

        self.performSegue(withIdentifier: "unwindToHomeScreen", sender: self)

Код перехода отмотки InitialViewControllers

    override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
        return true
    }

    override func canPerformUnwindSegueAction(_ action: Selector, from fromViewController: UIViewController, sender: Any?) -> Bool {
        return true
    }

    @IBAction func unwindToInitialViewController(sender: UIStoryboardSegue) {}

Я не думаю, что эта раскрутка работает, потому что не существует ссылки на InitialViewController . Я бы показал изображение макета, но проект является секретным по своей природе до запуска продукта ... Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, или я не ясно изложил свое описание проблемы.

1 Ответ

0 голосов
/ 11 июля 2020

Если вы попробуете это:

func ToSomeScreen() {
    
    let homeViewController = storyboard?.instantiateViewController(identifier: "Storyboard ID") as? ScreenCustummerViewController  //file name for next screen
    
    view.window?.rootViewController = homeViewController
    view.window?.makeKeyAndVisible()
    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...