2012-02-10 15 views
11

現在、私はアラーム(ローカル通知)を備えたタイマーを持っています。カスタムクラスからユニークなUILocalNotificationを作成およびキャンセルするにはどうすればよいですか?

このコードからタイマークラスを作成して、複数のタイマーと通知(最大でも5個)を作成したいと思います。クラスメソッドで一意の通知を作成およびキャンセルする方法には苦労しています。私の仮定は、私が「アラーム」のiOSと呼ばれるUILocalNotificationを作成するクラスのメソッドを持っている場合、同じ通知として通知のすべてが表示され、次のような方法は、私はそれを望むように機能しないだろうということです

- (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]; 

} 

- (void)cancelAlarm { 

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

} 

だから私はこれらのUILocalNotificationを作成時に名前を付ける方法が必要です。 alarm1 alarm2 ... alarm5ので、私は正しいものを取り消すことができます。

ありがとうございます。

+0

これらをNSMutableArrayまたはNSMutableDictionary(それらにキーを割り当てる)に格納して、コンテナをトラバースして解放することができます。 –

+0

ありがとう、私はそれを試してみましょう。 –

答えて

32

UILocalNotificationにあるuserInfo辞書パラメータには、問題の答えがあります。この辞書のキーの値を設定して、通知を識別できます。

これを簡単に実装するには、タイマークラスにNSString「名前」プロパティを設定するだけです。そしてその値のためのキーのためにいくつかのクラスワイド文字列を使用してください。コードに基づいた基本的な例を次に示します。

#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]; 
} 

この実装は比較的自明です。基本的には、タイマークラスのインスタンスに-scheduleAlarmが呼び出され、新しい通知が作成されると、kTimerNameKeyの値として文字列プロパティ "name"が設定されます。したがって、このインスタンスが-cancelAlarmを呼び出すと、通知の配列を列挙し、そのキーの名前で通知を探します。そして、それが見つかるとそれを取り除きます。

あなたの次の質問は、各タイマーの名前プロパティに一意の文字列を与える方法です。あなたはまた、タイトルラベルで名前プロパティを結ぶことができ

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

:私はあなたが(問題に関するあなたの他の質問から)それらをインスタンス化するためにIBを使用している知っていることが起こるので、あなたのようなviewDidLoad何かでこれを行う可能性が高いでしょうあなたが持っているかもしれません。

+0

ありがとうございました!非常に明確な説明と、堅実なコード例。すべてが理にかなっており、魅力のように機能します。しかし私が興味を持ったのは、なぜcheduledNotificationsをコピーする必要があるのか​​ということでした。 –

+1

@jemicha嬉しいです。 'scheduledLocalNotifications'をなぜコピーする必要があるのか​​という質問に答えるために、そうではありません。これは私の極端なパラノイアの例です。もしappleがポリシーの変更(それほど恐ろしいことではないと思われる)またはバグのいずれかで、内部的な通知のNSMutableArrayを公開すると、このコピーは起こりうる問題を回避します。しかし、もしあなたがそれを残しておけば、あなたはおそらく違いを見逃すでしょう。 – NJones

+0

'' '' dictionaryWithObject:self.name'''をどこに置くのですか? '' 'self.name'''をどのようにして一意のIDに変更しますか? – Supertecnoboff

関連する問題