我正在提醒应用程序有表格视图,并且单元格中有日期,当该单元格日期成为今天时,UILocalNotification将触发。因为我正在使用以下代码
-(void)notification {
// logic for local notification start
NSDateFormatter *Form = [[NSDateFormatter alloc] init];
[Form setDateFormat:@"dd/MM/yyyy"];
UILocalNotification *notification = [[UILocalNotification alloc] init];
for (int i=0;i<_convertedBdates.count;i++)
{
NSDate *date =[Form dateFromString:[_convertedBdates objectAtIndex:i ]];
// NSLog(@"date%@",date);
if(notification)
{
notification.fireDate = date;
notification.timeZone = [NSTimeZone defaultTimeZone];
notification.alertBody = [NSString stringWithFormat:@"Today is %@\'s Birthday",[_combinedNameArray objectAtIndex:i]];
notification.alertAction = @"View";
notification.soundName = UILocalNotificationDefaultSoundName;
notification.applicationIconBadgeNumber = 1;
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
}
// local notification logic ends here
}
现在我还实现了从表视图中删除单元格的功能 现在我的问题是细胞被移除,但它的通知不是没有细胞,但是当那个日期到来时,然后通知火。
删除该单元格时,如何删除该特定通知?
答案 0 :(得分:1)
编辑:我最初的回答是错误的,因为我没有意识到操作系统会在您安排它们时复制UILocalNotification
,而不是仅保留它们。所以......
据我所知,有两种方法可以做到这一点。
如果您没有安排很多通知,这将会更有效率,并且编码肯定会更容易。 (注意:我不太了解工作中的低级别事情,说哪个更有效率,但我的猜测是差异并不重要。)
每当删除一行时,只需调用
即可[[UIApplcation sharedApplication] cancelAllLocalNotifications];
然后相应地更新_convertedBDates
,最后再次调用notification
方法,为那些仍然存在的事件重新安排新的本地通知。
这可能是更有效的方法,如果您能想出一个很好的方法来制作这些唯一标识符,并且如果您安排了大量通知。 (强调可能)。一种可能性是使用通知将触发的时间,如果您可以保证不会同时触发两个通知。其他可能性是通知的标签(再次,如果您可以确定唯一性)。无论您决定使用哪种唯一标识符,都可以通过在for循环外添加它来存储它:
self.uniqueIDArray = [[NSMutableArray alloc] init];
(其中uniqueIDArray是您班级的NSMutableArray* @property
)然后在安排通知之前这样做:
[uniqueIDArray addObject:whateverObjectYouUseForTheUniqueID];
notification.userInfo = [[NSDictionary alloc] initWithObjects:whateverObjectYouUseForTheUniqueID
forKeys:@"uniqueID"];
然后,无论你用什么方法删除单元格,你都会这样做:
uniqueIDToDelete = [self.uniqueIDArray objectAtIndex:indexOfCellBeingDeleted];
NSArray *scheduledNotifications = [[UIApplication sharedApplication] scheduledNotifications];
UILocalNotification *notifToDelete;
for (UILocalNotification *notif in scheduledNotifications) {
if ([[notif.userInfo objectForKey:@"uniqueID"] isEqual:uniqueIDToDelete]) {
[[UIApplication sharedApplication] cancelLocalNotification:notif];
}
}
[self.uniqueIDArray removeObjectAtIndex:indexOfCellBeingDeleted];
答案 1 :(得分:1)
我认为你不应该使用cell作为通知来源。请改用数据模型。您也可以轻松删除通知
<强>更新强>
Model *model = [_array objectAtIndex:indexPath.row]; model.notificationID = // here you store created notification identifier
[[UIApplication sharedApplication] scheduledLocalNotifications] // contains all local notifications, you should search you need by ID and remove it using cancelLocalNotification method.
P.S。您可以在通知userInfo中存储的通知ID
答案 2 :(得分:0)
试试这个
NSArray *notificationArray = [[UIApplication sharedApplication] scheduledLocalNotifications]; UILocalNotification *notif = [notificationArray objectAtIndex:indexPath]; [[UIApplication sharedApplication] cancelLocalNotification:notif];