2013-03-09 15 views
6

मैं एक साधारण उलटी गिनती टाइमर बनाने की कोशिश कर रहा हूं ताकि जब कोई खिलाड़ी मेरे खेल में प्रवेश करता है तो टाइमर 60 से 0 तक शुरू होता है। यह आसान लगता है लेकिन मैं इसे कैसे लिखता हूं इस पर उलझन में हूं।(NSTimer) एक टाइमर उलटी गिनती

-(int)countDownTimer:(NSTimer *)timer { 
    [NSTimer scheduledTimerWithTimeInterval:-1 
           invocation:NULL 
            repeats:YES]; 
    reduceCountdown = -1; 
    int countdown = [[timer userInfo] reduceCountdown]; 
    if (countdown <= 0) { 
     [timer invalidate]; 
    } 
    return time; 
} 

खेल मैं आरंभ 60. पर पूर्णांक समय लेबल तो ViewController के भीतर निर्धारित की जा रही है के शुरू में:

अब तक मैं अपने GameController.m के भीतर एक विधि है कि इस तरह दिखता है बनाया है । लेकिन फिलहाल जब मैं कोड संकलित करता हूं तो यह लेबल 60 पर दिखाता है और बिल्कुल कमी नहीं करता है।

किसी भी मदद की सराहना की जाएगी - मैं उद्देश्य-सी के लिए नया हूं।


संपादित

कुछ सहायता अब मैं 2 अलग तरीकों में कोड अलग किया है से है। कोड अब इस तरह दिखता है:

-(void)countDown:(NSTimer *)timer { 
    if (--time == 0) { 
     [timer invalidate]; 
     NSLog(@"It's working!!!"); 
    } 
} 

-(void)countDownTimer:(NSTimer *)timer { 
    NSLog(@"Hello"); 
    [NSTimer scheduledTimerWithTimeInterval:1 
             target:self 
          selector:@selector(countDown:) 
             userInfo:nil 
             repeats:YES]; 
} 

हालांकि, कोड अभी भी ठीक से नहीं चल रहा है और जब मैं अपने दृश्य नियंत्रक से विधि [खेल countDownTimer] कहते हैं यह कह टूटता: "गैर मान्यता प्राप्त चयनकर्ता उदाहरण के लिए भेजा" । क्या कोई यहां समझा सकता है कि क्या गलत है?

उत्तर

11

कई चीजें अपने कोड के साथ गलत कर रहे हैं:

  • आप समय अंतराल के लिए एक गलत पैरामीटर गुजर रहे हैं - ऋणात्मक संख्याओं 0.1 एमएस
  • के रूप में व्याख्या कर रहे हैं
  • आप गलत ओवरलोड पर कॉल कर रहे हैं - आपको एक आमंत्रण ऑब्जेक्ट पास करने की उम्मीद है, फिर भी आपपास कर रहे हैं
  • आप उस कोड को डालते हैं जिसे आप टाइमर पर टाइमर प्रारंभिक के साथ निष्पादित करना चाहते हैं - टाइमर पर निष्पादित करने वाले कोड को एक अलग विधि में जाना चाहिए।

आप अधिभार कि एक चयनकर्ता लेता है कहते हैं, और नहीं बल्कि -1 से अंतराल के लिए 1 गुजरती हैं, करना चाहिए।

प्रचार NSTimer *timer और int remainingCounts, तो जगह है जहाँ आप उलटी गिनती शुरू करना चाहते करने के लिए

timer = [NSTimer scheduledTimerWithTimeInterval:1 
             target:self 
             selector:@selector(countDown) 
             userInfo:nil 
             repeats:YES]; 
remainingCounts = 60; 

जोड़ें।

-(void)countDown { 
    if (--remainingCounts == 0) { 
     [timer invalidate]; 
    } 
} 
+0

वह उस तरह से एक बार फिर से आग नहीं करेगा? मुझे लगता है कि यह '--remainingCounts == 0' होना चाहिए, नहीं? –

+0

@ दाईज-दंजन आप सही हैं, यह या तो 'शेष राशि = 59' या' --remainingCounts' होना चाहिए। धन्यवाद! – dasblinkenlight

+0

आपकी प्रतिक्रिया dasblinkenlight के लिए धन्यवाद। हालांकि, अभी भी इसे चलाने के लिए संघर्ष कर रहा है! फिलहाल मेरा चयनकर्ता गिनती विधि से संचार नहीं कर रहा है यानी जब मैं कोड संकलित करता हूं तो कुछ भी नहीं हो रहा है। क्या ऐसा हो सकता है क्योंकि टाइमर शुरू नहीं हुआ है या वे जुड़े नहीं हैं? –

0

आपके द्वारा उत्पन्न प्रश्न से। आप इसे प्रत्येक 1 सेकंड के लिए एक फ़ंक्शन का आह्वान करके प्राप्त कर सकते हैं और उसमें कमी तर्क को संभाल सकते हैं।

स्निपेट: -

NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 1.0 
         target: self 
         selector:@selector(onTick:) 
         userInfo: nil repeats:YES]; 
(void)onTick 
{ 
    //do what ever you want 
    NSLog(@"i am called for every 1 sec"); 
//invalidate after 60 sec [timer invalidate]; 
} 
+0

मैं CountdownTimer रूप में एक ही विधि के भीतर onTick विधि लिखने करें का प्रयास करें: फिर उलटी गिनती विधि ही जोड़ सकता हूँ? –

+0

आप अलग-अलग विधि नाम लिखकर आपको उलझाने के लिए क्षमा करने के बजाय उलटी गिनती टिमर विधि का उपयोग कर सकते हैं। –

1

इस

- (void)startCountdown 
{ 
    _counter = 60; 

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 
                 target:self 
                selector:@selector(countdownTimer:) 
                userInfo:nil 
                repeats:YES]; 
} 

- (void)countdownTimer:(NSTimer *)timer 
{ 
    _counter--; 
    if (_counter <= 0) { 
     [timer invalidate]; 
     // Here the counter is 0 and you can take call another method to take action 
     [self handleCountdownFinished]; 
    } 
} 
+0

आपकी प्रतिक्रिया के लिए धन्यवाद - आप अपने पूर्णांक से पहले अंडरस्कोर का उपयोग कैसे करते हैं? मुझे ऐसा करने की ज़रूरत क्यों है? –

+0

मैंने एक संपत्ति का काउंटर बनाया और ऑटो संश्लेषित गुणों के साथ एक्सकोड अंडरस्कोर का उपयोग करता है। – bbarnhart

+0

यह कहता है कि 'अविकसित पहचानकर्ता का उपयोग' _counter, मैं इसे कैसे हल कर सकता हूं? –

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