Estás en el camino correcto hasta el momento.
Siguiendo con el código que ya tiene, aquí es cómo advanceTimer
método debe buscar para hacer que funcione:
- (void)advanceTimer:(NSTimer *)timer
{
[countdown setIntegerValue:([countdown integerValue] - 1)];
if ([countdown integerValue] == 0)
{
// code to stop the timer
}
}
edición: Para hacer que todo sea más orientado a objetos, y para evitar la conversión a partir de cadenas a números y volver cada vez, me gustaría en vez de hacer algo como esto:
// 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
Y, si se puede hacer uso de fijaciones, simplemente podría obligar del campo de texto intValue
a la propiedad de la counter
Controller
. Esto le permitiría eliminar el IBOutlet
en la interfaz de clase, y la línea setIntegerValue:
en advanceTimer
.
actualización: Se ha eliminado el código que agrega el temporizador al ciclo de ejecución dos veces. Gracias a Nikolai Ruhe y nschmidt por notar ese error.
actualización: Se utilizó el método setIntegerValue
para simplificar el código, de acuerdo con nschmidt.
edición: del error tipográfico en la definición de (void) advanceTimer: temporizador (NSTimer *) ... causado molesto 'selector no reconocido enviado a la instancia' excepción
El temporizador de cuenta regresiva se agrega dos veces al ciclo de ejecución, lo que es incorrecto. –
@Nikolai Ruhe: Gracias por señalar eso. He eliminado el código incorrecto de mis ejemplos. –
Supongo que setIntegerValue es más eficiente que [NSString stringWithFormat:], así que no habría hecho esta "optimización". Especialmente porque no ayuda a la claridad del código. – nschmidt