Почему KYDrawerController не отображается, когда код запускается из ответа Alamofire? - PullRequest
0 голосов
/ 07 марта 2019

Я использую KYDrawerController для отображения бокового меню на главном экране при успешном входе в систему.

Я использую Alamofire для запроса аутентификации пользователя, когда ответ успешен, затем откройте главный экран с помощьюящик.

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

Alamofire.request(URL_LOGIN_PHONE, method: .post, parameters: parameters).responseJSON {  response in

        switch response.result {
        case .success(let value):
            let jsonResponse = JSON(value)

            // Check if status = success
            if jsonResponse["status"] == "success" {

        // Init Drawer
        let appDelegate = UIApplication.shared.delegate as! AppDelegate

        let storyBoard = UIStoryboard.init(name: "Main", bundle: Bundle.main)

        let navVC = storyBoard.instantiateViewController(withIdentifier: "NavVC")  // is the main controller for the drawer.
        let drawerVC = storyBoard.instantiateViewController(withIdentifier: "DrawerVC")  // is the drawer, and the drawer needs a main controller

        appDelegate.drawerController.mainViewController = navVC
        appDelegate.drawerController.drawerViewController = drawerVC

        appDelegate.window?.rootViewController = appDelegate.drawerController
        appDelegate.window?.makeKeyAndVisible()

            } else {

            }

        case .failure( _):
        }

    }

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Проблема не связана с Alamofire или основным потоком, просто код пытался создать экземпляр загруженного ящика. Поэтому я добавил код, чтобы проверить, загружен он или нет. если он уже загружен, я использовал unwindSegue для возврата к контроллеру основного вида.

let appDelegate = UIApplication.shared.delegate as! AppDelegate
        // check if drawer loaded or not.
        if appDelegate.drawerController.isViewLoaded {
            // Drawer loaded prevoiusly, dont load it again
            appDelegate.drawerController.setDrawerState(.closed, animated: true)
            self.exitToRestaurants()
        } else {
            // Drawer not loaded from prevouis use.
            // and it will be loaded for the first time/
            let storyBoard = UIStoryboard.init(name: "Main", bundle: Bundle.main)

            let navVC = storyBoard.instantiateViewController(withIdentifier: "NavVC")  // is the main controller for the drawer.
            let drawerVC = storyBoard.instantiateViewController(withIdentifier: "DrawerVC")  // is the drawer, and the drawer needs a main controller


            appDelegate.drawerController.mainViewController = navVC
            appDelegate.drawerController.drawerViewController = drawerVC

            appDelegate.window?.rootViewController = appDelegate.drawerController
            appDelegate.window?.makeKeyAndVisible()
        }
0 голосов
/ 07 марта 2019

Вы должны поместить код в блок асинхронного закрытия, например,

DispatchQueue.main.async {
 // Init Drawer
    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    let storyBoard = UIStoryboard.init(name: "Main", bundle: Bundle.main)

    let navVC = storyBoard.instantiateViewController(withIdentifier: "NavVC")  // is the main controller for the drawer.
    let drawerVC = storyBoard.instantiateViewController(withIdentifier: "DrawerVC")  // is the drawer, and the drawer needs a main controller

    appDelegate.drawerController.mainViewController = navVC
    appDelegate.drawerController.drawerViewController = drawerVC

    appDelegate.window?.rootViewController = appDelegate.drawerController
    appDelegate.window?.makeKeyAndVisible()
}
...