2012-05-19 13 views
13

Ich bin neu in iOS-Programmierung. Ich arbeite an Wörtern, die Spiel passen. In diesem Spiel muss ich einen Zeitzähler implementieren, der Minuten und Sekunden anzeigt. Ich möchte, wenn mein Spiel gestartet wird, meinen Timer mit 3 Minuten starten. Jetzt möchte ich diesen Timer in umgekehrter Richtung mit Sekunden verringern. mein Code nur für seconds..here Arbeit ist mein Code:Implementierung eines Countdown-Timers in Objective-c?

secondsLeft--; 

    int seconds = (secondsLeft %3600) % 60; 

    Timerlbl.text = [NSString stringWithFormat:@"%02d",seconds]; 


    if (seconds==0) 

{ 


UIAlertView *pAlert = [[UIAlertView alloc]initWithTitle:@"Sorry!!" 
message:@"TimeOver"  delegate:self cancelButtonTitle:@"OK" 
otherButtonTitles:@"Cancel",nil]; 

[pAlert show]; 

[pAlert release]; 

} 

} 

In viewDidLoad ich es durch Timer nennen ..

  countDown=[NSTimer scheduledTimerWithTimeInterval:5.0 target:self 
       selector:@selector(TimeOver) userInfo:nil repeats:YES]; 

Bitten jemand mich leiten, wie ich es in beiden Minuten tun können, und Sekunden.

+0

Bitte überprüfen Sie den folgenden Link [Countdown-Timer] (http://fromideatoapp.com/downloads/FI2ADemo-Part4.zip) Es ist auch ziemlich handlich. Grüße, Neil – NIKHIL

Antwort

46

Sie können es tun, wie folgt (ARC Aktiviert): -

@interface ViewController() 
{ 
UILabel *progress; 
    NSTimer *timer; 
    int currMinute; 
    int currSeconds; 
} 
@end 


@implementation ViewController 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    progress=[[UILabel alloc] initWithFrame:CGRectMake(80, 15, 100, 50)]; 
    progress.textColor=[UIColor redColor]; 
    [progress setText:@"Time : 3:00"]; 
    progress.backgroundColor=[UIColor clearColor]; 
    [self.view addSubview:progress]; 
    currMinute=3; 
    currSeconds=00; 

    // Do any additional setup after loading the view, typically from a nib. 
} 
-(void)start 
{ 
    timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFired) userInfo:nil repeats:YES]; 

} 
-(void)timerFired 
{ 
if((currMinute>0 || currSeconds>=0) && currMinute>=0) 
{ 
    if(currSeconds==0) 
    { 
     currMinute-=1; 
     currSeconds=59; 
    } 
    else if(currSeconds>0) 
    { 
     currSeconds-=1; 
    } 
    if(currMinute>-1) 
    [progress setText:[NSString stringWithFormat:@"%@%d%@%02d",@"Time : ",currMinute,@":",currSeconds]]; 
} 
    else 
    { 
     [timer invalidate]; 
    } 
} 
+0

Danke Liebe @roronoa zorro Ihre Antwort ist die beste Lösung, die ich will. – jamil

+0

Hi @ roronoa-zorro, fragte sich, wie man damit umgehen sollte, den Timer anzuhalten? – gdubs

+0

Sie können den Timer nicht pausieren oder neu starten, Sie können ihn nur ungültig machen. Die Pause & Resume kann repliziert werden, indem Sie eine NSDate-Variable verwenden, das aktuelle NSDate zu dem Zeitpunkt speichern, an dem Sie pausieren (eigentlich ungültig machen) möchten NSDate-Objekt –

0

Sie können NSTimer verwenden, um dies zu erreichen.

+1

Schauen Sie sich dieses Tutorial an, es wird Ihnen helfen, zu erreichen, was Sie wollen - http://pravinmagdum.wordpress.com/tag/nstimer-tutorial/ – rishi

+1

können Sie vollständige Fehlerzeile und auch den Code hinzufügen, wo Sie sind diesen Fehler bekommen. – rishi

+1

Checkout dies, könnte dies Problem verursacht Ihnen - http://StackOverflow.com/Questions/2340930/stray-342-in-C-Program – rishi

3

In .h-Datei

IBOutlet UILabel* lblTimer; 
NSTimer* gameTimer; 

In .m-Datei

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self createTimer]; 
} 

- (void)createTimer 
{  
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSRunLoop* runLoop = [NSRunLoop currentRunLoop]; 

    gameTimer = [[NSTimer timerWithTimeInterval:1.00 target:self selector:@selector(timerFired:) userInfo:nil repeats:YES] retain]; 
    [[NSRunLoop currentRunLoop] addTimer:gameTimer forMode:NSDefaultRunLoopMode]; 
    timeCount = 20; 
    [runLoop run]; 
    [pool release]; 
} 

- (void)timerFired:(NSTimer *)timer 
{ 
    if(timeCount == 0) 
    { 
     [self timerExpired]; 
    } 
    else 
    { 
     timeCount--; 
     if(timeCount == 0) { 
     [timer invalidate]; 
     [self timerExpired]; 
    } 
} 
    lblTimer.text = [NSString stringWithFormat:@"%02d:%02d",timeCount/60, timeCount % 60]; 
    self.title = lblTimer.text; 
} 

Bind das oben Label-Outlet mit Etikett in Aussicht.

Es funktioniert richtig mit mir

+1

NSRunLoop hängt das Steuerelement, wenn es auf das Ereignis gerichtet ist, das durch die Aktion eines bestimmten UIView'control aufgerufen wird. –

+0

[self timerExpired]; Entschuldigung, welche Methode ruft das an? –

15

Ich weiß, diese alte Frage, aber ich möchte, dass meine Art und Weise teilen, dies zu erreichen . Wir haben Methode (timeIntervalSinceDate :) um das Intervall zu berechnen und haben eine feste Anzahl von Sekunden zum Countdown. In meinem Fall 300 s.

UPDATE Juli 2015 SWIFT

@IBAction func startTimer(sender: UIButton) { 
    sender.selected = !sender.selected; 
    //if selected fire timer, otherwise stop 
    if (sender.selected) { 
     self.timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("updateTimer"), userInfo: nil, repeats: true); 
     self.startDate = NSDate(); 
    } else { 
     self.stopTimer(); 
    } 

} 

func stopTimer() { 
    self.timer.invalidate(); 
} 

func updateTimer() { 
    // Create date from the elapsed time 
    var currentDate:NSDate = NSDate(); 
    var timeInterval:NSTimeInterval = currentDate.timeIntervalSinceDate(self.startDate!); 

    //300 seconds count down 
    var timeIntervalCountDown = 300 - timeInterval; 
    var timerDate:NSDate = NSDate(timeIntervalSince1970: timeIntervalCountDown); 

    // Create a date formatter 
    var dateFormatter = NSDateFormatter(); 
    dateFormatter.dateFormat = "mm:ss"; 
    dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0); 

    // Format the elapsed time and set it to the label 
    var timeString = dateFormatter.stringFromDate(timerDate); 
    self.timerLabel?.text = timeString; 
} 

Working github swift sample project

Objective-C

- (void)updateTimer 
{ 
    // Create date from the elapsed time 
    NSDate *currentDate = [NSDate date]; 
    NSTimeInterval timeInterval = [currentDate 
            timeIntervalSinceDate:self.startDate]; 
    NSLog(@"time interval %f",timeInterval); 

    //300 seconds count down 
    NSTimeInterval timeIntervalCountDown = 300 - timeInterval; 

    NSDate *timerDate = [NSDate 
         dateWithTimeIntervalSince1970:timeIntervalCountDown]; 

    // Create a date formatter 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"mm:ss"]; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0.0]]; 


    // Format the elapsed time and set it to the label 
    NSString *timeString = [dateFormatter stringFromDate:timerDate]; 
    self.stopWatch.text = timeString; 
} 

- (void)stopTimer 
{ 
    [self.stopWatchTimer invalidate]; 
    self.stopWatchTimer = nil; 
    [self updateTimer]; 

} 

- (void)startTimer 
{ 

    if (self.stopWatchTimer) { 
     [self.stopWatchTimer invalidate]; 
     self.stopWatchTimer = nil; 
    } 

    self.startDate = [NSDate date];  

    // Create the stop watch timer that fires every 100 ms 
    self.stopWatchTimer = [NSTimer scheduledTimerWithTimeInterval:1.0/10.0 
              target:self 
             selector:@selector(updateTimer) 
             userInfo:nil 
              repeats:YES]; 
} 

UPDATE:

Es ist extrem teuer, einen NSDateFormatter jedes Mal zu erstellen, wenn Sie updateTimer durchlaufen. Es ist viel besser, den NSDateFormatter außerhalb der Schleife zu erstellen und ihn wiederzuverwenden. Credits: @siburb

+2

Danke dafür! Das ist sehr gut. – ullstrm

+0

Falls jemand dieses Verbatim kopieren/einfügen wird (Sie wissen, wer Sie sind -), ist es extrem teuer, jedes Mal einen 'NSDateFormatter' zu erstellen, wenn Sie' updateTimer' durchlaufen. Es ist viel besser, den 'NSDateFormatter' außerhalb der Schleife zu erstellen und ihn wiederzuverwenden. – siburb

+0

@siburb, Messepunkt, wird Ihren Kommentar in Update enthalten –

Verwandte Themen