objective c - objective - Obj-C-> Incrementando un número(y mostrando los pasos en una etiqueta Cocoa)
objective c vs swift (2)
Para permitir que el ciclo de ejecución se ejecute entre mensajes, use un NSTimer
o un NSTimer
retrasado. Aquí está el último:
- (IBAction) start:(id)sender {
[self performSelector:@selector(updateTextFieldWithNumber:) withObject:[NSNumber numberWithInt:0] afterDelay:1.0];
}
- (void) updateTextFieldWithNumber:(NSNumber *)num {
int i = [num intValue];
[outputField setIntValue:i];
if (i < 10)
[self performSelector:@selector(updateTextFieldWithNumber:) withObject:[NSNumber numberWithInt:++i] afterDelay:1.0];
}
Aquí hay una solución basada en temporizador. Puede encontrarlo más fácil de seguir. Puede establecer el valor del campo de texto desde el campo de texto:
@interface TestNums: NSObject
{
IBOutlet NSTextField *outputField;
NSTimer *timer;
int currentNumber;
}
@end
@implementation TestNums
- (IBAction) start:(id)sender {
timer = [[NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(updateTextField:)
userInfo:nil
repeats:YES] retain];
//Set the field''s value immediately to 0
currentNumber = 0;
[outputField setIntValue:currentNumber];
}
- (void) updateTextField:(NSTimer *)timer {
[outputField setIntValue:++currentNumber];
}
@end
Aquí hay una solución basada en temporizador aún mejor (limpia), que usa una propiedad. Tendrá que vincular el campo de texto a la propiedad en Interface Builder (seleccione el campo, presione ⌘4, elija su objeto e ingrese currentNumber
como la clave para enlazar).
@interface TestNums: NSObject
{
//NOTE: No outlet this time.
NSTimer *timer;
int currentNumber;
}
@property int currentNumber;
@end
@implementation TestNums
@synthesize currentNumber;
- (IBAction) start:(id)sender {
timer = [[NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(updateTextField:)
userInfo:nil
repeats:YES] retain];
//Set the field''s value immediately to 0
self.currentNumber = 0;
}
- (void) updateTextField:(NSTimer *)timer {
self.currentNumber = ++currentNumber;
}
@end
La solución basada en la propiedad tiene al menos dos ventajas:
- Su objeto no necesita saber sobre el campo de texto. (Es un objeto modelo, separado del objeto de vista que es el campo de texto).
- Para agregar más campos de texto, simplemente créelos en IB. No tiene que agregar ningún código a la clase TestNums.
Soy nuevo con Objective-C, así que probablemente haya una solución simple para esto.
Quiero un número para incrementar, pero cada iteración se mostrará en una etiqueta. (por ejemplo, muestra 1, 2, 3, 4, 5 ... se muestran separados por una cantidad de tiempo).
Lo intenté:
#import "testNums.h"
@implementation testNums
- (IBAction)start:(id)sender {
int i;
for(i = 0; i < 10; ++i)
{
[outputNum setIntValue:i];
sleep(1);
}
}
@end
y todo lo que hizo fue esperar 9 segundos (aparentemente congelado) y luego mostrar 9 en el cuadro de texto.
Sí, porque eso es lo que le dijiste que hiciera. Los gráficos no se actualizarán hasta que el ciclo de ejecución principal sea libre de mostrarlos. Tendrá que usar NSTimer
o algún método para hacer lo que quiera.
Una mejor pregunta podría ser por qué quieres hacer esto?