В моем делегате приложения я пытаюсь настроить LocalNotification ActionHandler для выполнения перехода и отправки уведомления целевому ViewController для запуска функции в этом классе, но где-то вдоль линии уведомление не публикуется или не принимается должным образом.
Стоит отметить, что на данный момент целевой контроллер представления не инициализирован.
Вот мой код на данный момент: Фрагмент из AppDelegate:
func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forLocalNotification notification: UILocalNotification, completionHandler: () -> Void) {
if identifier == "mainAction" {
self.window?.makeKeyAndVisible()
self.window?.rootViewController?.navigationController?.popToRootViewControllerAnimated(true)
(self.window?.rootViewController as? UINavigationController)?.viewControllers.first?.performSegueWithIdentifier("Segue", sender: self)
NSNotificationCenter.defaultCenter().postNotificationName("NC_SegueDidPerform", object: nil)
}
а вот в принимающем View Controller:
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserverForName("NC_SegueDidPerform", object: nil, queue: nil, usingBlock: ({ (notification: NSNotification!) in
print ("working")
}))
}
Я также пытался поместить наблюдателя в ViewWillApear и ViewDidAppear, но безрезультатно. Блок просто не выполняется!
Как мне заставить его работать, чтобы я мог получать уведомление (или любой вид «сигнала» в целевом контроллере представления?
Заранее спасибо.
performSegue
не является немедленным, поэтому вы отправляете уведомление до его завершения. Поскольку вы выталкиваете все контроллеры перед переходом, у вас нет контроллеров-наблюдателей, если я что-то не упустил? Единственными контроллерами являются корень навигационного контроллера и конечный контроллер перехода. Было бы лучше просто сообщить целевому контроллеру, что он был отправлен в результате действия с помощью метода prepareForSegue корневого контроллера. - person Rory McKinnel   schedule 26.09.2015handleMainAction
, который принимаетuserInfo
в качестве аргумента. В этом методе вызовитеperformSegue
, и вы можете передатьuserInfo
вprepareForSegue
целевому контроллеру. Я не вижу необходимости в уведомлениях, когда ты знаешь, кто единственный и неповторимый наблюдатель. Так что ИМХО, просто используйте методы, описанные в начале комментария. - person Rory McKinnel   schedule 26.09.2015