Не може да се публикува известие от AppDelegate при обработка на действие localNotification

В делегата на моето приложение се опитвам да настроя 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, но без резултат. Блокът просто не се изпълнява!

Как да го накарам да работи, така че да мога да получа известие (или някакъв вид „сигнал“ в целевия View Controller?

Благодаря предварително.


person Glenncito    schedule 25.09.2015    source източник
comment
Ти сам отговори на въпроса си.   -  person user523234    schedule 26.09.2015
comment
Изясних си въпроса. Как да постигна получаване на известие в контролера за целеви изглед?   -  person Glenncito    schedule 26.09.2015
comment
performSegue не е незабавно, така че изпращате известието, преди да е завършило. Тъй като изваждате всички контролери преди началото, нямате контролери за наблюдатели, освен ако не пропускам нещо? Единствените контролери са коренът на контролера за навигация и контролерът за местоназначение на сегмента. Би било по-добре просто да кажете на дестинационния контролер, че е бил натиснат в резултат на действие чрез метода pripraveForSegue на основния контролер.   -  person Rory McKinnel    schedule 26.09.2015
comment
В този случай не е необходимо да публикувате известие. Просто изведете целевия VC и му кажете директно какво искате да направи за това локално известие, което току-що сте получили.   -  person user523234    schedule 26.09.2015
comment
Искам да мога да изпращам данни чрез userInfo, поради което се надявах да накарам битът за известяване да работи, тъй като контролерът за изглед на местоназначение зависи от данните. И така, това, което казвате, е, че трябва да извикам метод „prepareForSegue“, за да получа достъп до променливите на целевия VC?   -  person Glenncito    schedule 26.09.2015
comment
Добавете метод към вашия основен контролер, наречен handleMainAction, който приема вашия userInfo като аргумент. В този метод извикайте performSegue и можете да предадете userInfo в prepareForSegue на целевия контролер. Не виждам нужда от известия, когато знаете кой е единственият наблюдател. Така че IMHO, просто използвайте методите, както е описано в началото на коментара.   -  person Rory McKinnel    schedule 26.09.2015


Отговори (1)


Правите го по грешен начин. Както правилно посочихте, извикването на performSegueWithIdentifier: не гарантира, че контролерът за изглед ще бъде достъпен незабавно, така че вашето известие, че задействате следващия ред, не достига до целевия контролер за изглед. Предложеният начин на Apple е да се приложи prepareForSegue: и да се прехвърлят данни към дестинацията VC. Този метод е възможността за извиквания да предаде всякакви желани данни към целевия VC.

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
   if (segue.identifier == "Segue") {
    // pass data to next view
   }
}
person Abhinav    schedule 26.09.2015
comment
Опитах това, но изглежда, че не работи, ако го сложа в AppDelegate. Това трябва ли да се извика от rootViewController? - person Glenncito; 26.09.2015
comment
Приложете това във вашия изходен VC, VC, откъдето започва вашето преминаване. Ако това е съвсем нов VC, тогава ще трябва да го инициализирате от сценария и да предадете данните директно към създадения обект. - person Abhinav; 26.09.2015