2015-01-17 10 views
6

में NSMenu खुला होने पर NSTimer फायरिंग नहीं है मेरे पास एक टाइमर है जो एक बार बंद होने के बाद अलार्म को पुनरारंभ करने के लिए चलाता है।स्विफ्ट

alarm = NSTimer.scheduledTimerWithTimeInterval(
    60 * minutesConstant + secondsConstant, 
    target:self, 
    selector: Selector("endSession"), 
    userInfo: nil, 
    repeats:false) 

इसका चयनकर्ता समारोह एक विधा ध्वज सेट करता है और मूल कार्य है कि नए मिनट और सेकंड स्थिरांक साथ अलार्म सेट कहता है, और यह भी एक उपयोगकर्ता सूचना है कि सत्र पुन: प्रारंभ भेजता है।

मैं एक मेनू आइटम शेष समय

enter image description here

तो मैं कर रहा हूँ यह जाँच करने के लिए है कि मेरे अलार्म वास्तव में पुन: प्रारंभ करता है खोलने के साथ अद्यतन किया जाता है कि है, और अधिसूचना से पता चलता है कि एक बार यह शून्य हो जाती है । यह काम करता है, लेकिन जब मेरे पास मेनू खुलता है और यह शून्य हो जाता है तो यह 0:00 बजे रहता है और जब तक मैं मेनू से क्लिक नहीं करता तब तक टाइमर आग नहीं करता है, जिस बिंदु पर यह तुरंत अधिसूचना दिखाता है और टाइमर को रीसेट करता है ।

मेनू खोलने पर टाइमर को आग लगाने के लिए कैसे मजबूर कर सकता हूं? यह एक बड़ा सौदा नहीं है, लेकिन मैं नहीं चाहता कि उपयोगकर्ता सत्र के साथ भ्रमित हो जाए, अगर वे टाइमर नीचे जाते हैं तो बस लटकता है।

उत्तर

17

तुम बस के रूप में अनुवर्ती मुख्य runloop करने के लिए अपने टाइमर जोड़ने के लिए:

स्विफ्ट 3

RunLoop.main.add(alarm, forMode: .commonModes) 

स्विफ्ट 2.x

NSRunLoop.mainRunLoop().addTimer(alarm, forMode: NSRunLoopCommonModes) 
+1

यह वह जगह है सही बात। यह मूल रूप से आप हवाई अड्डे के मेनू में क्या देख सकते हैं क्योंकि यह समय-समय पर एसएसआईडी – uchuugaka

+1

के लिए स्कैन करता है विशेष रूप से, रन लूप मेनू ट्रैकिंग के दौरान 'NSEventTrackingRunLoopMode' में चल रहा है। यदि आपका टाइमर केवल 'NSDefaultRunLoopMode' में है, तो यह आग नहीं लगेगा। उन दोनों मोड 'NSRunLoopCommonModes' सेट में हैं, इसलिए उस छद्म-मोड में टाइमर जोड़ना इसे दोनों मामलों (और अन्य) में आग लगने देता है। –

+0

बिल्कुल सही, प्रतिक्रिया और स्पष्ट स्पष्टीकरण के लिए धन्यवाद! –