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編集済み: OS を単に保持するのではなく、スケジュールするときにOS が s をコピーすることを認識していなかったため、最初の回答は間違っていました。そう...

私が知る限り、これを行うには2つの方法があります。

  • 行が削除されたときにすべての通知をキャンセルしてから、残りの通知を再スケジュールします。

スケジュールされた通知があまりない場合、これはより効率的であり、コード化が間違いなく簡単になります。(注: 作業中の低レベルの事柄について、どちらがより効率的であると言えるほど十分にわかっているわけではありませんが、私の推測では、その違いはそれほど重要ではないと思います。)

行が削除されるたびに、単に呼び出します

[[UIApplcation sharedApplication] cancelAllLocalNotifications];

次に、適切に更新_convertedBDatesし、最後にnotificationメソッドを再度呼び出して、まだ残っているイベントの新しいローカル通知を再スケジュールします。

  • ローカル通知の一意の識別子を作成する

これらの一意の識別子を作成する良い方法を考え出すことができ、多くの通知がスケジュールされている場合、これはおそらくより効率的な方法です. (可能性を強調)。1 つの可能性は、2 つの通知が同時に発生しないことを保証できる場合、通知が発生する時刻を使用することです。その他の可能性は、通知のラベルです (一意性が確実な場合)。一意の識別子に使用するものは何でも、これを 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 に答える