删除包含日期的单元格时删除UILocalNotification

时间:2013-04-09 07:26:01

标签: ios uilocalnotification

我正在提醒应用程序有表格视图,并且单元格中有日期,当该单元格日期成为今天时,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   

}

现在我还实现了从表视图中删除单元格的功能 现在我的问题是细胞被移除,但它的通知不是没有细胞,但是当那个日期到来时,然后通知火。

删除该单元格时,如何删除该特定通知?

3 个答案:

答案 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];