.
- (void)advanceTimer:(NSTimer *)timer
{
[countdown setIntegerValue:([countdown integerValue] - 1)];
if ([countdown integerValue] == 0)
{
// code to stop the timer
}
}
düzenleme: Zaten sahip koduyla tutunan
, burada advanceTimer
yöntem çalışması için bakmak gerekir nasıl yapmak için her şeyi nesne yönelimli daha ve dönüştürme önlemek için sayılara dizeleri ve arka her zaman, bunun yerine böyle bir şey yapacağını:
// Controller.h:
@interface Controller
{
int counter;
IBOutlet NSTextField * countdownField;
}
@property (assign) int counter;
- (IBAction)startCountdown:(id)sender;
@end
// Controller.m:
@implementation Controller
- (IBAction)startCountdown:(id)sender
{
counter = 60;
NSTimer *countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(advanceTimer:)
userInfo:nil
repeats:YES];
}
- (void)advanceTimer:(NSTimer *)timer
{
[self setCounter:(counter -1)];
[countdownField setIntegerValue:counter];
if (counter <= 0) { [timer invalidate]; }
}
@end
Ve, bağlamaları yararlanabilir eğer, sadece metin alanı en intValue
Controller
ait counter
özelliğine bağlanabilir. Bu, sınıf arabirimindeki IBOutlet
ve 'daki setIntegerValue:
satırını elemenize olanak tanır.
güncelleme: Zamanlayıcıyı çalışma döngüsüne iki kez ekleyen kodu kaldırıldı. Bu hatayı fark ettiğin için Nikolai Ruhe ve nschmidt'e teşekkür ederim.
Güncelleme: Kodu basitleştirmek için, nschmidt'e göre setIntegerValue
yöntemini kullandık.
düzenleme: (boşluk) advanceTimer tanımında Typo: (NSTimer *) zamanlayıcı ... can sıkıcı
CountdownTimer, çalışma döngüsüne iki kez eklenir, bu yanlıştır. –
@Nikolai Ruhe: Bunu işaret ettiğiniz için teşekkür ederim. Yanlış kodu örneklerimden kaldırdım. –
Sanırım setIntegerValue, [NSString stringWithFormat:] değerinden daha verimlidir, bu yüzden bu "optimizasyon" işlemini yapmazdım. Özellikle de kodun açıklığına yardımcı olmadığından. – nschmidt