Здравствуйте, Я пишу приложение, которое должно отвечать с обновлением пользовательского интерфейса и внутренним изменением состояния, когда местный notifcation используется, чтобы открыть его. Я использую раскадровку и я настроил мой главный контроллер представления, чтобы наблюдать изменения состояния:применение: didFinishLaunchingWithOptions: стрельба уведомления, прежде чем контроллер назначения создаются
- (void)viewDidLoad
{
[super viewDidLoad];
// ...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resumeByNotification:) name:@"Resume" object:nil];
}
В моем приложении делегат у меня есть это:
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
if (application.applicationState == UIApplicationStateInactive)
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"Resume" object:self userInfo:notification.userInfo];
}
}
И это прекрасно работает: если приложение работая в фоновом режиме, контроллер просмотра будет перехватывать уведомление и реагировать соответствующим образом. (Если приложение работает на переднем плане, оно игнорируется, потому что пользовательский интерфейс позаботится напрямую.)
Проблема возникает, когда приложение было убито и получено уведомление. Я написал это в методе didFinishLaunchingWithOptions, что делает телефон вибрировал как быстрой техники отладки :), и я сделать получить уведомление:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UILocalNotification *localNotification = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
if (localNotification)
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"Resume" object:self userInfo:localNotification.userInfo];
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}
return YES;
}
В телефоне вибрировать так уведомление есть, но он оленья кожа Кажется, это заставляет наблюдателя. Я полагаю, что это связано с тем, что метод didViewLoad контроллера вида еще не вызван. Я не знаю, как это сделать. Я полагаю, что я мог бы использовать метод instantiateViewControllerWithIdentifier: UIStoryboard, чтобы убедиться, что на самом деле есть контроллер представления, но не могу ли я получить его «лишний» экземпляр, в дополнение к тому, который в конечном итоге будет создан в результате собственного жизненного цикла раскадровки ? Судя по тому, что говорится в справочной документации по классу, это не значит, что это нужно делать.
Я пропустил что-то очень очевидное здесь? На самом деле, мой подход правильный для такого рода ситуации?
Спасибо!
Спасибо, используя 'initWithcoder:' работал как шарм. Все эти шаги в жизненном цикле объекта могут запутаться. :) – Jollino
Спасибо, это работает, если вы используете push-уведомления вместо локальных уведомлений и никакой раскадровки. Просто используйте методы 'init'. – yoeriboven
['init (coder:)'] (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSCoding_Protocol/index.html#//apple_ref/occ/intfm/NSCoding/initWithCoder :) –