2012-02-10 17 views
11

Hiện tại tôi có bộ hẹn giờ với báo thức (thông báo cục bộ).Làm cách nào để tạo và hủy UILocalNotification duy nhất khỏi lớp tùy chỉnh?

Tôi muốn tạo lớp hẹn giờ từ mã này để tạo nhiều bộ hẹn giờ và thông báo (tối đa 5) và tôi đang đấu tranh với cách tạo và hủy thông báo duy nhất bằng phương thức lớp.

- (UILocalNotification *) startAlarm { 

    [self cancelAlarm]; //clear any previous alarms 

    alarm = [[UILocalNotification alloc] init]; 
    alarm.alertBody = @"alert msg" 
    alarm.fireDate = [NSDate dateWithTimeInterval: alarmDuration sinceDate: startTime]; 
    alarm.soundName = UILocalNotificationDefaultSoundName; 

    [[UIApplication sharedApplication] scheduleLocalNotification:alarm]; 

} 

giả định của tôi là nếu tôi có một phương pháp học tạo ra một UILocalNotification gọi là "báo động" iOS sẽ thấy tất cả các thông báo như là thông báo tương tự và phương pháp sau đây sẽ không hoạt động theo cách tôi muốn nó :

- (void)cancelAlarm { 

    if (alarm) {  
     [[UIApplication sharedApplication] cancelLocalNotification:alarm]; 
    } 

} 

Vì vậy, tôi cần cách đặt tên cho các UILocalNotifications này khi chúng được tạo ví dụ alarm1 alarm2 ... alarm5 để tôi có thể hủy đúng.

Xin cảm ơn trước.

+0

Bạn có thể lưu trữ chúng trong NSMutableArray hoặc NSMutableDictionary (gán khóa cho chúng) và giải phóng chúng bằng cách duyệt qua vùng chứa. –

+0

Cảm ơn, tôi sẽ thử. –

Trả lời

32

Câu trả lời cho vấn đề của bạn nằm trong tham số từ điển userInfo mà mọi số UILocalNotification đều có. Bạn có thể đặt giá trị cho các khóa trong từ điển này để xác định thông báo.

Để thực hiện điều này một cách dễ dàng, tất cả những gì bạn phải làm là có lớp bộ đếm thời gian có thuộc tính "name" NSString ". Và sử dụng một số chuỗi lớp cho khóa cho giá trị đó. Dưới đây là ví dụ cơ bản dựa trên mã của bạn:

#define kTimerNameKey @"kTimerNameKey" 

-(void)cancelAlarm{ 
    for (UILocalNotification *notification in [[[UIApplication sharedApplication] scheduledLocalNotifications] copy]){ 
     NSDictionary *userInfo = notification.userInfo; 
     if ([self.name isEqualToString:[userInfo objectForKey:kTimerNameKey]]){ 
      [[UIApplication sharedApplication] cancelLocalNotification:notification]; 
     } 
    } 
} 
-(void)scheduleAlarm{ 
    [self cancelAlarm]; //clear any previous alarms 
    UILocalNotification *alarm = [[UILocalNotification alloc] init]; 
    alarm.alertBody = @"alert msg"; 
    alarm.fireDate = [NSDate dateWithTimeInterval:alarmDuration sinceDate:startTime]; 
    alarm.soundName = UILocalNotificationDefaultSoundName; 
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:self.name forKey:kTimerNameKey]; 
    alarm.userInfo = userInfo; 
    [[UIApplication sharedApplication] scheduleLocalNotification:alarm]; 
} 

Việc triển khai này phải tương đối tự giải thích. Về cơ bản, khi một thể hiện của lớp timer được gọi là -scheduleAlarm và nó đang tạo một thông báo mới, nó đặt thuộc tính chuỗi của nó là "name" làm giá trị cho kTimerNameKey. Vì vậy, khi trường hợp này gọi -cancelAlarm, nó liệt kê mảng thông báo tìm kiếm thông báo có tên là khóa đó. Và nếu nó tìm thấy nó sẽ loại bỏ nó.

Tôi tưởng tượng câu hỏi tiếp theo của bạn sẽ là cách cung cấp cho mỗi thuộc tính tên của bộ tính giờ của bạn một chuỗi duy nhất. Kể từ khi tôi xảy ra cho biết bạn đang sử dụng IB để nhanh chóng chúng (từ câu hỏi khác của bạn về vấn đề này), bạn sẽ có khả năng làm điều này trong viewDidLoad cái gì đó như:

self.timerA.name = @"timerA"; 
self.timerB.name = @"timerB"; 

Bạn cũng có thể buộc các tài sản tên với một nhãn tiêu đề bạn có thể có.

+0

Cảm ơn bạn rất nhiều lần nữa! Lời giải thích rất rõ ràng, và một ví dụ mã rắn. Mọi thứ đều có ý nghĩa và nó hoạt động giống như một sự quyến rũ. Một điều tôi đã tò mò về tuy nhiên là lý do tại sao nó là cần thiết để sao chép cheduledNotifications. –

+1

@jemicha Vui vì tôi có thể giúp. Để trả lời câu hỏi của bạn là tại sao cần sao chép 'scheduledLocalNotifications', nó không phải là. Đây là một ví dụ về sự hoang tưởng cực đoan của tôi. Nếu táo từng lộ ra nội bộ 'NSMutableArray' của các thông báo, hoặc thông qua một thay đổi chính sách (rất khó có thể xảy ra) hoặc một lỗi, thì bản sao này sẽ tránh được các vấn đề có thể xảy ra. Nhưng một lần nữa nếu bạn bỏ nó ra, bạn sẽ không bao giờ thấy sự khác biệt. – NJones

+0

Nơi bạn đặt '' 'dictionaryWithObject: self.name''' - làm thế nào để bạn thay đổi' '' self.name''' thành một ID duy nhất? – Supertecnoboff

Các vấn đề liên quan