Нажмите на ViewController из AppDelegate со стеком и панелью навигации - PullRequest
1 голос
/ 11 марта 2019

Я разрабатываю приложение для обмена сообщениями, и у меня возникают проблемы с реализацией поведения push-уведомлений.

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

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

Пока что я попробовал:

let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChatViewController") as! ChatViewController
vc.contactName = name as String
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = vc
self.window?.makeKeyandVisible()

При этом открывается правильный разговор, и появляются сообщения, но элементы пользовательского интерфейса не реагируют (не могут писать при нажатии на текстовое поле, не могут перейти в галерею при нажатии кнопки и т. Д.), А также отсутствует панель навигации.

Итак, после некоторого исследования я попробовал это:

let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChatViewController") as! ChatViewController
vc.contactName = name as String
let rootViewController = self.window?rootViewController as! UINavigationController
rootViewController. pushViewController(vc, animated: true)

Это не работает. Нет сообщения об ошибке, но экран просто белый.

Это моя раскадровка: enter image description here Я использую SWRevealViewController для бокового меню, а в разделе сообщений есть вкладка BarController со списком контактов на вкладке 2º.

РЕДАКТИРОВАТЬ: При втором способе возникает ошибка.

Не удалось привести значение типа 'SWRevealViewController к UINavigationController'

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Я думаю, вы должны пойти с NotificationCenter, чтобы сделать это.

Когда пользователь нажимает на уведомление, вы должны опубликовать NotificationCenter в didReceive следующим образом:

NotificationCenter.default.post(name: .onMessageRecieved, object: notificationObject)

И в зависимости от того, в каком контроллере представления вы находитесь, вы должны добавить наблюдателя в функцию viewDidLoad (), чтобы он понимал, что сообщение получено следующим образом:

override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(self, selector: #selector(MyViewController.onMessageRecieved(notification:)), name: .onMessageRecieved, object: nil)

}

И у вас должна быть функция (onMessageRectained) в контроллере вида, чтобы выполнять навигацию следующим образом:

    func onMessageRecieved(notification: NSNotification){

            // open the conversation

            let vc = self.storyboard?.instantiateViewController(withIdentifier: "ChatViewController") as! ChatViewController

            vc.contactName = name as String 

            self.navigationController?.pushViewController(vc, animated: true)

   }

Таким образом, вы выполняете навигацию от контроллера представления, поэтому навигация также будет там.

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

Не удалось преобразовать значение типа 'SWRevealViewController в UINavigationController'

Эта проблема связана с тем, что «SWRevealViewController» не является подклассом UINavigationController.Таким образом, вы не можете разыграть его таким образом.

Чтобы решить проблему чата ViewController, вы должны изменить свой код следующим образом.

let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChatViewController") as! ChatViewController
let nav = vc.navigationController
vc.contactName = name as String
let rootViewController = self.window?rootViewController as! UIViewController
rootViewController.presentViewController(nav, animated: true, completion: nil)

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

Вы просто попробуйте это и дайте мне знать, работает или нет.

...