Переход к определенному контроллеру представления при нажатии в уведомлении и разблокировке пользователя - PullRequest
0 голосов
/ 08 октября 2019

У меня есть это приложение в Swfit 4, и я хочу перейти к определенному контроллеру представления. Я заставил его работать, когда пользователь вошел в систему:

     let storyboard = UIStoryboard(name: "Tracker", bundle: nil)

     // instantiate the view controller we want to show from storyboard
     // then we push the new view controller to it
      if  let conversationVC = storyboard.instantiateViewController(withIdentifier: "TrackerIntroViewController") as? TrackerIntroViewController {

          conversationVC.isComingFromNotification = true

          if let mainView = self.window?.rootViewController as? MainViewController {

              let mainNavigationController = mainView.mainViewController
              let menuTableViewController = mainView.leftViewController

              if let nav2 = mainNavigationController as? UINavigationController {

                    nav2.dismiss(animated: true, completion: nil)
                    nav2.pushViewController(conversationVC, animated: true)
               }

         }

}

Но когда пользователь не заблокирован, когда пользователь нажимает на уведомление, он переходит к Tracker, но без входа в систему, что делает его непригодным для использования.

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

Точка входа в приложение - MainViewController: SlideMenuController. На mainViewController на слайде - MainNavigationController, а на левом ViewController - MenuTableViewController

class MainViewController: SlideMenuController {

    var comingFromMedicationNotification: Bool = false

    override func awakeFromNib() {

        // Get the width.
        let width = self.view.bounds.width - 50.0

        if SlideMenuController.isLeft() {
            SlideMenuOptions.leftViewWidth = width
        } else {
            SlideMenuOptions.rightViewWidth = width
        }

        // Scale the content.
        SlideMenuOptions.contentViewScale = 1.0

        if let controller = self.storyboard?.instantiateViewController(withIdentifier: "MainNavigationController") {

            self.mainViewController = controller

            // NEVER ENTERING HERE
            if let loginViewController = self.mainViewController?.presentedViewController as? LoginViewController {

                loginViewController.comingFromMedicationNotification = comingFromMedicationNotification
            }
        }

        if let controller = self.storyboard?.instantiateViewController(withIdentifier: "MenuTableViewController") {

            // Check the side.
            if SlideMenuController.isLeft() {
                self.leftViewController = controller
            } else {
                self.rightViewController = controller
            }
        }

        super.awakeFromNib()
    }
}

В MainNavigationController - это место, где происходит вход в систему, и, если оно прошло успешно, оно переходит к DashboardViewController.

MainNavigationController Точка входа в раскадровку: UINavigationController -> LoginViewController

Я пытаюсь передать переменную в LoginViewController, когда пользователь нажимает на уведомление, а не нажимает контроллер представления на навигацию. контроллер, и в LoginViewController, если он приходит из уведомления, перейдите к определенному контроллеру представления.

Но я не могу найти контроллер представления LoginViewController для передачи переменной.

Это то, что я пробовал в userNotificationCenter(_ center: UNUserNotificationCenter, didReceive ...), но это не входит ни в один из этих ifs


    conversationVC.isComingFromNotification = true


    if let mainView = self.window?.rootViewController as? MainViewController {

       let mainNavigationController = mainView.mainViewController


        if let main = mainNavigationController as? LoginViewController{
              main.comingFromMedicationNotification = true
         }

         if let main2 = mainNavigationController?.presentedViewController as? LoginViewController {
            main2.comingFromMedicationNotification = true
         }

         if let login = mainNavigationController?.presentingViewController as? LoginViewController {
              login.comingFromMedicationNotification = true
          }



 }

Есть идеи, как мне подойти к этому?

1 Ответ

0 голосов
/ 09 октября 2019

Я думаю, что вам действительно нужно сделать что-то вроде AppContext. Вам понадобится класс, который хранит контекст приложения, и в этом случае пришло уведомление.

После получения уведомления подготовьте перечисление, представляющее тип имен уведомлений. После того, как вы получите уведомление, всегда проверяйте isUserLoggedIn (), а затем обрабатывайте запрос. Или же просто позвольте пользователю войти в систему.

После того, как вход выполнен, убедитесь, что вы сначала проверили Appcontext.hasNotificationToProcess (), а затем действовали на этом внутри вашего контроллера представления посадки.

Этовсегда вынуждает приложение сначала проверить аутентификацию, а затем обработать уведомление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...