#objective-c #unusernotificationcenter #unusernotification
#objective-c #unusernotificationcenter #уведомление о неиспользовании
Вопрос:
РЕДАКТИРОВАТЬ: я устанавливаю ровно 365 локальных уведомлений UNUserNotification (по одному на каждый день в году). Кнопка вызывается одновременно:
[self name1];
[self name2];
...
[self name365];
- одно имя на каждый день. Если я попробую только, например, 3 дня, он работает отлично. Если я вызываю all days (365 раз), запускается только последнее локальное уведомление (365. только) — день 1-364 пропущен (не запущен). Есть идеи?
Код:
-(void)Name1{
NSDateComponents *comps = [[NSDateComponents alloc] init];
comps.hour = 9;
comps.minute = 0;
comps.day = 23;
comps.month = 10;
UNMutableNotificationContent *objNotificationContent = [[UNMutableNotificationContent alloc] init];
objNotificationContent.title = [NSString localizedUserNotificationStringForKey:@"NAME" arguments:nil];
objNotificationContent.body = [NSString localizedUserNotificationStringForKey:@"text"
arguments:nil];
objNotificationContent.sound = [UNNotificationSound soundNamed:@"notif_bobicek.mp3"];
UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents: comps repeats:YES];
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"requestNotificationForName1"
content:objNotificationContent trigger:trigger];
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
if (!error) { NSLog(@"Local Notification succeeded"); }
else { NSLog(@"Local Notification failed"); }}];
}
.
-(void)Name2{ ... // same code
-(void)Name365{... // same code
Примечание: идентификатор отличается для каждого запланированного локального уведомления.
Комментарии:
1. Я думаю, вам следует попытаться добавить счетчик, а не иметь 365 повторяющихся фрагментов кода. Что, если вам нужно его изменить? Если у вас должно быть 365 кодов, попробуйте создать его, используя вместо #define . По крайней мере, вы можете изменить его только одним способом. Я не знаком с локальными уведомлениями, но, возможно, им нужны разные идентификаторы запросов?
Ответ №1:
Это не дает прямого ответа на ваш вопрос, и вам действительно следует параметризовать свой подход, но то, что я вам покажу, может вам очень помочь. Я хочу четко проиллюстрировать, что я имел в виду, используя #define в моем комментарии.
Использование #define — это мощный способ решить некоторые сложные проблемы, и даже здесь он может сделать вашу жизнь намного проще. Подумайте о #define как о типе поиска и замены, которым он буквально был раньше, и здесь вы можете использовать это, чтобы определить ваше сообщение ОДИН РАЗ, а затем заменить его 365 раз вместо создания 365 разных сообщений. Вот схема.
// MyClass.m
#import "MyClass.h"
// The indicates the macro continues on the next line
// Note this becomes just one long string without linebreaks so you can
// not use // to comment, you must use /* ... */ to comment
// The ## indicates it is a string concatenation
#define MYFUNC( DAY )
- ( void ) name ## DAY {
/* Now you are inside nameDAY e.g. name1, name2 ... etc */
NSDateComponents *comps = [[NSDateComponents alloc] init];
comps.hour = 9;
comps.minute = 0;
comps.day = 23;
comps.month = 10;
/* Some examples below */
NSUInteger day = DAY;
NSString * s = [NSString stringWithFormat:@"ID:%lu", DAY];
NSLog( @"Inside %@", s );
};
@implementation MyClass
// Now you can create them as below
MYFUNC( 1 )
MYFUNC( 2 )
MYFUNC( 3 )
MYFUNC( 4 )
// etc
// They are now defined and can be called as normal
- ( void ) test
{
[self name1];
[self name2];
[self name3];
// etc
}
@end
Если вы параметризуете свой подход, но вам все еще нужны 365 функций, вы можете, например, расширить #define, добавив дополнительные параметры. В любом случае, для получения дополнительной информации см. Эту действительно хорошую ссылку.
https://en.wikibooks.org/wiki/C_Programming/Preprocessor_directives_and_macros
ПРИВЕТ