0

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

}

现在我还实现了从表格视图中删除单元格的功能现在我的问题是单元格被删除但它的通知不是没有单元格但是当那个日期到来时通知就会触发。

删除该单元格后,我应该如何删除该特定通知?

4

3 回答 3

1

编辑:我最初的答案是错误的,因为我没有意识到操作系统会UILocalNotification在您安排它们时复制 s,而不仅仅是保留它们。所以...

据我所知,有两种方法可以做到这一点。

  • 删除行时取消所有通知,然后重新安排其余通知。

如果您没有安排很多通知,这将更有效率,而且编码肯定会容易得多。(注意:我对工作中的低级事物知之甚少,不能说哪个必然更有效,但我的猜测是差异并不重要。)

每当删除一行时,只需调用

[[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];
于 2013-04-09T07:34:30.643 回答
1

我认为您不应该使用单元格作为通知源。改用数据模型。您也可以轻松删除通知

更新

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.

PS通知ID,您可以存储在通知userInfo中

于 2013-04-09T07:38:17.700 回答
0

试试这个

NSArray *notificationArray = [[UIApplication sharedApplication] scheduledLocalNotifications];
UILocalNotification *notif = [notificationArray objectAtIndex:indexPath];
[[UIApplication sharedApplication] cancelLocalNotification:notif];
于 2014-03-12T16:31:01.317 回答