2012-07-29 18 views
15

खींचते समय काम नहीं कर रहा है मेरे पास एक उलटी गिनती टाइमर के साथ एक एप्लिकेशन है। मैं एक लेबल है कि एक समारोह इस तरह से एक टाइमर से कहा जाता है के साथ अद्यतन किया जाता है के साथ कर दिया है:NSTimer UITableView

... 
int timeCount = 300; // Time in seconds 
... 
NSTimer *myTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(actualizarTiempo:) userInfo:nil repeats:YES]; 
... 
- (void)actualizaTiempo:(NSTimer *)timer { 
    timeCount -= 1; 
    if (timeCount <= 0) { 
     [timer invalidate]; 
    } else { 
     [labelTime setText:[self formatTime:timeCount]]; 
    } 
} 

नोट: formatTime एक समारोह जो एक पूर्णांक (सेकंड की संख्या) प्राप्त है और प्रारूप मिमी के साथ एक NSString देता है : एसएस

सब कुछ ठीक काम करता है, यानी, समय गिना जाता है लेकिन समस्या यह है कि मेरे पास एप्लिकेशन में UITableView है और यदि मैं तालिका को स्पर्श करता हूं और खींचता हूं (कोशिकाओं के साथ स्थानांतरित करने के लिए) टाइमर तब तक बंद हो जाता है जब तक टाइमर बंद नहीं हो जाता स्क्रीन से मेरी उंगली जारी करें ...

क्या यह व्यवहार सामान्य है? यदि ऐसा है, तो क्या इससे बचने और टेबल खींचते समय टाइमर काम करने का कोई तरीका है?

उत्तर

25

scheduledTimerWithTimeInterval: का उपयोग करके, j.tom.schroeder कहते हैं, आपका टाइमर डिफ़ॉल्ट मोड के लिए मुख्य रन लूप पर स्वचालित रूप से शेड्यूल किया जाता है। यह आपके टाइमर को फायरिंग से रोक देगा जब आपका रन लूप गैर-डिफ़ॉल्ट मोड में है, उदाहरण के लिए, टैपिंग या स्वाइप करते समय।

समाधान है, हालांकि, एक धागा का उपयोग नहीं कर रहा है, लेकिन सभी आम मोड के लिए अपने टाइमर का समय निर्धारण:

NSTimer *timer = [NSTimer timerWithTimeInterval:1 
             target:self 
             selector:@selector(actualizarTiempo:) 
             userInfo:nil repeats:YES]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

घटनाओं के प्रकार पर निर्भर है कि आप अपने टाइमर रोक उनके बिना अनुमति देने के लिए चाहते हैं, तो आप हो सकता है UITrackingRunLoopMode पर भी विचार करें। रन लूप मोड के बारे में अधिक जानकारी के लिए, Apple Docs देखें।

+0

आपकी मदद के लिए बहुत बहुत धन्यवाद, यह इस समाधान के साथ काम करता है। मैं लूप मोड्स पर एक नज़र डालने वाला हूं जो मेरी घटनाओं के लिए बेहतर फिट बैठता है – rai212

+1

'[टाइमर अमान्य] 'पर नज़र डालें,' व्यूविल डिस्प्लेयर 'या किसी अन्य विधि पर या आप टाइमर को बार-बार आग लगा देंगे । – skornos

0

यह सामान्य व्यवहार है। scheduledTimerWithTimeInterval: वर्तमान रन लूप पर शेड्यूल, इसलिए UITableView के साथ कोई भी इंटरैक्शन actualizarTiempo: विधि को कॉल करने से रोक देगा। अलग थ्रेड पर actualizarTiempo: निष्पादित करने के लिए एनएसटीएचड विधियों detachNewThreadSelector:toTarget:withObject और sleepForTimeInterval का उपयोग करें।

+0

सच समस्या तथ्य यह है कि टाइमर वर्तमान रन पाश से संबंधित था से संबंधित था। विभिन्न लूप मोड के साथ NSRunLoop का उपयोग समस्या को हल करता है। धन्यवाद – rai212

3

यहाँ स्विफ्ट संस्करण:

var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "removeFromSuperview", userInfo: nil, repeats: false) 
NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) 
+0

स्विफ्ट 3+ संस्करण: RunLoop.main.add (टाइमर, मोड के लिए: RunLoopMode.commonModes) –