2012-02-10 12 views
11

वर्तमान में मैं एक अलार्म (स्थानीय अधिसूचना) के साथ एक टाइमर है।मैं एक कस्टम क्लास से अद्वितीय UILocalNotification कैसे बना और रद्द कर सकता हूं?

मैं इस कोड से एक टाइमर वर्ग एकाधिक टाइमर और सूचनाएं बनाने के लिए और मैं कैसे बना सकते हैं और एक वर्ग विधि के साथ अद्वितीय अधिसूचना को रद्द करने के साथ संघर्ष कर रहा हूँ (सबसे 5 पर) बनाना चाहते हैं।

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

} 

मेरे धारणा है कि अगर मैं एक वर्ग विधि है कि एक UILocalNotification कहा जाता है बनाता है "अलार्म" iOS ही अधिसूचना होने के रूप में सभी सूचनाएं देखेंगे और निम्न विधि तरह से मैं यह करना चाहता हूँ से काम नहीं करेगा :

- (void)cancelAlarm { 

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

} 

तो मुझे इन UILocalNotifications को नामित करने के लिए एक तरीका चाहिए जैसे कि वे बनाए गए हैं अलार्म 1 अलार्म 2 ... अलार्म 5 इसलिए मैं सही को रद्द कर सकता हूं।

अग्रिम धन्यवाद।

+0

आप उन्हें एक NSMutableArray या NSMutableDictionary (उन्हें एक महत्वपूर्ण बताए) में स्टोर और कंटेनर traversing द्वारा उन्हें जारी कर सकता है। –

+0

धन्यवाद, मैं इसे आज़मा दूंगा। –

उत्तर

32

आपकी समस्या का उत्तर userInfo शब्दकोश पैरामीटर में है जो प्रत्येक UILocalNotification है। अधिसूचना की पहचान करने के लिए आप इस शब्दकोश में कुंजी के लिए मान सेट कर सकते हैं।

आसानी से इसे लागू करने के तुम सब करने की है, तो अपने टाइमर वर्ग एक 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 के लिए मूल्य के रूप में पैदा कर रही है असल में जब। तो जब यह उदाहरण -cancelAlarm पर कॉल करता है तो यह उस कुंजी के नाम के साथ अधिसूचना की तलाश में अधिसूचनाओं की सरणी को दर्शाता है। और यदि यह एक पाता है तो यह इसे हटा देता है।

मैं कल्पना अपने अगले सवाल यह है कि अपने टाइमर के प्रत्येक नाम संपत्ति एक अद्वितीय स्ट्रिंग देने के लिए किया जाएगा।

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

तुम भी एक शीर्षक लेबल के साथ में नाम संपत्ति बाँध सकती: आप viewDidLoad कुछ की तरह में ऐसा होने की संभावना है, क्योंकि मुझे पता है तुम आईबी का उपयोग कर रहे उन्हें (इस मामले पर अपने अन्य सवाल से) का दृष्टांत को को भी हो आप ले सकते हैं।

+0

बहुत बार धन्यवाद! बहुत स्पष्ट स्पष्टीकरण, और एक ठोस कोड उदाहरण। सब कुछ समझ में आता है और यह एक आकर्षण की तरह काम करता है। एक चीज जो मैं उत्सुक था, हालांकि शेड्यूल्ड नोटिफिकेशन की प्रतिलिपि बनाना आवश्यक था। –

+1

@ जेमिचा ग्लाड मैं मदद कर सकता था। अपने प्रश्न का उत्तर देने के लिए कि 'निर्धारित लोकल नोटिफिकेशन' की प्रतिलिपि बनाना क्यों आवश्यक था, ऐसा नहीं है। यह मेरे चरम परावर्तक का एक उदाहरण है। यदि सेब ने कभी भी पॉलिसी चेंज के माध्यम से नोटिफिकेशन के आंतरिक 'एनएसएमयूटेबलएरे' का खुलासा किया है (तो यह संभवतः यह हंसने योग्य है) या एक बग, तो यह प्रति संभावित समस्याओं से बच जाएगी। लेकिन फिर यदि आप इसे छोड़ देते हैं तो आपको कभी भी कोई अंतर दिखाई नहीं देगा। – NJones

+0

जहां आप '' 'dictionaryWithObject: self.name''' डालते हैं - आप एक अद्वितीय आईडी में' '' self.name''' कैसे बदलते हैं? – Supertecnoboff

संबंधित मुद्दे

 संबंधित मुद्दे