2012-06-21 92 views
5

我知道有幾個問題herethere關於如何刪除本地通知可能是全部或特定通知。我也通過了local notification class reference,並找到了一些方法如重複的時間間隔,火災日期,警報主體,時區等...但我無法找到一些有關如何修改已設置的火災日期的信息。如果用戶設置通知的日期今天和下午4:50,但如果用戶希望修改設定的日期/時間,那麼發生的情況是兩種情況都會觸發通知。就編程倫理而言,這是一個錯誤!更新本地通知的開火日期並取消之前的通知

其實我想要的是以前的通知必須被取消,即日期必須修改編輯的一個通知,應設置併發射了新的日期。

我這是怎麼設置的通知,示例代碼:

- (void)setNotification 
{ 
    //Set notification after confirmation of saved data 

    Class cls = NSClassFromString(@"UILocalNotification"); 
    reminderNotification = [[cls alloc] init]; 

    if (cls != nil) 
    {   
     NSDateFormatter *dateFormat = [[[NSDateFormatter alloc]init]autorelease]; 
     [dateFormat setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; 
     NSDate *notificationDate = [dateFormat dateFromString:textField2.text]; 
     reminderNotification.fireDate = notificationDate; 
     reminderNotification.timeZone = [NSTimeZone defaultTimeZone]; 
     NSString *reminderText = [NSString stringWithFormat:@"%@ 's %@ on %@",textField.text,textField1.text,strDate]; 
     reminderNotification.alertBody = reminderText; 
     reminderNotification.alertAction = @"View"; 
     reminderNotification.soundName = @"lazy_afternoon.mp3"; 
     reminderNotification.applicationIconBadgeNumber = 1; 
     NSDictionary *userDict = [NSDictionary dictionaryWithObject:self.textField1.text forKey:kReminder]; 
     reminderNotification.userInfo = userDict; 
     [[UIApplication sharedApplication] scheduleLocalNotification:reminderNotification]; 
     [reminderNotification release]; 
    } 
} 

任何一個可以請指導我如何處理這個任務的正確的道路。

感謝所有提前:)

回答

18

使用此方法來安排的通知,凡notificationID必須是唯一的

-(void) scheduleNotificationForDate:(NSDate *)date AlertBody:(NSString *)alertBody ActionButtonTitle:(NSString *)actionButtonTitle NotificationID:(NSString *)notificationID{ 

    UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
    localNotification.fireDate = date; 
    localNotification.timeZone = [NSTimeZone localTimeZone]; 
    localNotification.alertBody = alertBody; 
    localNotification.alertAction = actionButtonTitle; 
    localNotification.soundName = @"yourSound.wav"; 

    NSDictionary *infoDict = [NSDictionary dictionaryWithObject:notificationID forKey:notificationID]; 
    localNotification.userInfo = infoDict; 

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
} 

使用此方法來取消特定的通知與通知ID

- (void)cancelLocalNotification:(NSString*)notificationID { 
    //loop through all scheduled notifications and cancel the one we're looking for 
    UILocalNotification *cancelThisNotification = nil; 
    BOOL hasNotification = NO; 

    for (UILocalNotification *someNotification in [[UIApplication sharedApplication] scheduledLocalNotifications]) { 
     if([[someNotification.userInfo objectForKey:notificationID] isEqualToString:notificationID]) { 
      cancelThisNotification = someNotification; 
      hasNotification = YES; 
      break; 
     } 
    } 
    if (hasNotification == YES) { 
     NSLog(@"%@ ",cancelThisNotification); 
     [[UIApplication sharedApplication] cancelLocalNotification:cancelThisNotification];   
    } 
} 

參考: UILocalNotification

+0

一個小疑問,可以申報通知ID與進度表通知,而不是把它放在方法本身:) –

+0

,因爲我需要調用[自我scheduleNotification]在保存按鈕的動作,如果我把它寫這樣的話,我怎麼能訪問所有這些變量,並將其放置在方法本身:( –

+0

讓我好好想想,你有[自scheduleNotification]的fireDate和alertBody內容的方法,這樣你就可以把上面的方法 - (空)scheduleNotificationForNotificationID:(的NSString *)notificationID;忽略你已經有了這些參數,您可以在保存按鈕作爲方法[自scheduleNotificationForNotificationID:@「yourUniqueId」]; – Bala

3

一旦您設置的通知,只有這樣,才能對其進行編輯,在取消舊的並重新創建一個又一個,這樣你就可以做到這一點的方式,搜索現有的一個,並取消。

for(UILocalNotification *aNotif in [[UIApplication sharedApplication] scheduledLocalNotifications]) { 
     if([[aNotif.userInfo objectForKey:@"id"] isEqualToString:nId]) { 
      [[UIApplication sharedApplication]cancelLocalNotification:aNotif]; 
     } 
    } 

然後創建新的通知。

+0

對不起,我無法理解的是這裏的關鍵,我應該爲每個通知的ID,如果是的話如何設置,請敷衍我,我是新來的本地通知,請參閱如何我我的代碼我設置的通知,謝謝:) –

+0

它的簡單,你只需要擁有您生成並存儲一個獨特的密鑰,並使用它,你可以,通知和使用相同的密鑰來取消它。如果你有一個通知,您可以存儲它在NSUserDefaults中,否則你需要多個條目的數據庫。我 – Dhruv