iOS Как отменить запланированное локальное уведомление - PullRequest
0 голосов
/ 08 сентября 2011

Я пишу приложение для iPhone, в котором у меня есть три таймера обратного отсчета, каждый из которых устанавливает локальное уведомление, когда они запускаются пользователем (IBAction).

У меня вопрос, как я могу сослаться наСуществующее локальное уведомление в другом месте кода?Я попытался сослаться на него напрямую, как это, которое вылетает:

[[UIApplication sharedApplication] cancelLocalNotification:myNotification];

И так после планирования уведомления и добавления его к пользовательским настройкам по умолчанию:

In my scheduling method...
[myDefaults setObject:myNotification forKey:@"myNotification"];
...

And in my cancelling method...
NSUserDefaults *myDefaults = [NSUserDefaults standardUserDefaults];
[[UIApplication sharedApplication] cancelLocalNotification:[myDefaults objectForKey:@"myNotification"]];
[myDefaults synchronize];

Мое приложение падает с SIGABRTошибка в строке cancelLocalNotification выше.Кто-нибудь может сказать мне, где я иду не так?

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 09 сентября 2011

Хорошо, я нашел рабочее решение моей проблемы, обдумав ее шаг за шагом.Я обнаружил, что решаю всю проблему совершенно неправильно!

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

Я помещаю этих наблюдателей в свой viewDidLoad;

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appWillResign) name:UIApplicationWillResignActiveNotification 
object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(appIsActive) name:UIApplicationDidBecomeActiveNotification 
object:nil];

и в моем методе appWillResign я настраивал уведомления для любых активных таймеров.Когда приложение возобновляется, я просто отменяю ВСЕ уведомления.

[[UIApplication sharedApplication] cancelAllLocalNotifications];

Короче говоря, вам не нужно ссылаться на уведомления в другом месте кода.Вы устанавливаете их только тогда, когда они абсолютно необходимы: когда приложение установлено на заднем плане!Таким образом, вам действительно не нужно «хранить» их где-либо для последующего использования.

Спасибо за ваш вклад @Learner, вы помогли поставить меня на правильный путь!: D

1 голос
/ 08 сентября 2011

Сложно предсказать, но обычно SIGABRT появляется при доступе к нулевому или освобожденному объекту.

Так в [[UIApplication sharedApplication] cancelLocalNotification:myNotification]; `

это может быть "myNotification", которая равна нулю.

ИЛИ если [myDefaults objectForKey:@"myNotification"] returns nil.

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

Объектом по умолчанию должен быть список свойств, то есть экземпляр (или для коллекций комбинация экземпляров): NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary. Если вы хотите сохранить какой-либо другой тип объекта, вы обычно должны заархивировать его для создания экземпляра NSData.

Что я могу предсказать, так это то, что myNotification, который хранится, имеет тип UILocalNotification., поэтому, вероятно, сбой хранения данных.

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

0 голосов
/ 19 августа 2014

Исправлена ​​ошибка синхронизации NSUserDefaults. Я предполагаю, что вы просто установили объект и не синхронизировали его. Если это так, то объект на самом деле не будет сохранен в NSUserDefaults, а только в локальный NSUserDefaults объект. Что вам нужно сделать, это позвонить [defaults synchronize] после установки объекта.

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