2011-05-20 15 views
9

पर कॉल नहीं करता है, अब मैं वास्तव में निराश हूं, पूरे इंटरनेट को गुमराह कर रहा हूं, एसओ के माध्यम से ठोकर खा रहा हूं और अभी भी कोई समाधान नहीं मिला है।NSTimer विधि

मैं एक एनएसटीमर लागू करने की कोशिश कर रहा हूं, लेकिन जिस पद्धति को मैंने परिभाषित किया है उसे कॉल नहीं किया जाता है। (सेकंड सही ढंग से सेट होते हैं, इसे ब्रेकपॉइंट्स के साथ चेक किया जाता है)।

- (void) setTimerForAlarm:(Alarm *)alarm { 
    NSTimeInterval seconds = [[alarm alarmDate] timeIntervalSinceNow]; 
    theTimer = [NSTimer timerWithTimeInterval:seconds 
          target:self 
          selector:@selector(showAlarm:) 
          userInfo:alarm repeats:NO]; 
} 

- (void) showAlarm:(Alarm *)alarm { 
    NSLog(@"Alarm: %@", [alarm alarmText]); 
} 

वस्तु "theTimer" @property साथ deined है::

@interface FooAppDelegate : NSObject <NSApplicationDelegate, NSWindowDelegate> { 
@private 

    NSTimer *theTimer; 

} 

@property (nonatomic, retain) NSTimer *theTimer; 

- (void) setTimerForAlarm:(Alarm *)alarm; 
- (void) showAlarm:(Alarm *)alarm; 

क्या मैं गलत कर रहा हूँ यहाँ कोड है?

+2

'शो अलार्म: (अलार्म *) अलार्म' के लिए विधि हस्ताक्षर 'showAlarm: (NSTimer *) टाइमर' होना चाहिए। फिर आपको अलार्म ऑब्जेक्ट 'अलार्म * अलार्म = [टाइमर उपयोगकर्ता इन्फॉर्म]' मिलेगा। – 0xced

+0

धन्यवाद, इसे पहले से मिला है ;-) – tamasgal

उत्तर

27

टाइमरविथटाइम इंटरवल बस एक टाइमर बनाता है, लेकिन निष्पादन के लिए इसे किसी भी रन लूप में नहीं जोड़ता है।

self.theTimer = [NSTimer scheduledTimerWithTimeInterval:seconds 
         target:self 
         selector:@selector(showAlarm:) 
         userInfo:alarm repeats:NO]; 

इसके बजाय प्रयास करें।

+0

ठीक है, यह स्पष्ट था ;-) मैंने इसे सभी उदाहरणों में अनदेखा किया ... – tamasgal

7

आपने एक एनएसटीमर ऑब्जेक्ट बनाया है लेकिन आपने इसे चलाने के लिए निर्धारित नहीं किया है। टाइमरविथटाइम इंटरवल: लक्ष्य: चयनकर्ता: userInfo: दोहराता है: एक टाइमर बनाता है जिसे आप बाद में चलाने के लिए शेड्यूल कर सकते हैं, उदाहरण के लिए, एप्लिकेशन लॉन्च पर टाइमर बनाने के लिए और जब उपयोगकर्ता बटन दबाता है तो यह गिनती शुरू कर देता है। या तो setTimerForAlarm के अंत में

[[NSRunLoop currentRunLoop] addTimer:theTimer forMode:NSDefaultRunLoopMode] 

फोन या

theTimer = [NSTimer scheduledTimerWithTimeInterval:seconds 
          target:self 
          selector:@selector(showAlarm:) 
          userInfo:alarm repeats:NO]; 

जो एक टाइमर और तुरंत यह कार्यक्रम बनाता है साथ

theTimer = [NSTimer timerWithTimeInterval:seconds 
          target:self 
          selector:@selector(showAlarm:) 
          userInfo:alarm repeats:NO]; 

बदलें।

+0

+1 दोनों सही और पूरी तरह से होने के लिए! (दरअसल, मुझे मध्यरात्रि तक अपवोट तक इंतजार करना पड़ता है - मैंने पहले से ही अपने दिन का suppy उपयोग किया है।) –

2

अच्छी तरह से आप timerWithTimeIntervalscheduledTimerWithTimeInterval के बजाय रन लूप पर वास्तव में अपने NSTimer शेड्यूल करना चाहते हैं।

theTimer = [NSTimer scheduledTimerWithTimeInterval:seconds 
         target:self 
         selector:@selector(showAlarm:) 
         userInfo:alarm repeats:NO]; 
2

जबकि जवाब में से ठीक हो, वहाँ एक भी सरल समाधान है कि सब पर एक NSTimer को शामिल नहीं करता है। आपका setTimerForAlarm: कार्यान्वयन एक सरल रेखा को कम किया जा सकता है:

[self performSelector:@selector(showAlarm:) withObject:alarm afterDelay:[[alarm alarmDate] timeIntervalSinceNow]] 
+0

धन्यवाद, लेकिन इस बिंदु पर एनएसटीमर बेहतर विकल्प है, क्योंकि मैं कभी भी टाइमर को रद्द करना चाहता हूं। :-) – tamasgal

+0

आप 'निष्पादक चयनकर्ता भी रद्द कर सकते हैं: ऑब्जेक्ट: बाद में:' '+ [NSObject CancelPreviousPerformRequestsWithTarget: selector: object:]' – 0xced

+1

इस पोस्ट के लिए धन्यवाद! यह एक बड़ा समय बचाने वाला है और मेरा कोड अधिक कॉम्पैक्ट है। – Adrian

8

भी भूल जाते हैं

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds 
            target:(id)target 
            selector:(SEL)aSelector 
            userInfo:(id)userInfo 
            repeats:(BOOL)repeats 

मुख्य थ्रेड में कहा जाता है की जाँच करने के नहीं है।

+1

यह वास्तव में महत्वपूर्ण है! यह मेरे टाइमर फायरिंग का कारण था – jere

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