我是Objective-C的新手,所以可能有一个简单的解决方案.
我想要一个数字递增,但每次迭代都要在标签上显示.(例如,它显示1,2,3,4,5 ......分开显示一段时间).
我试过了:
#import "testNums.h" @implementation testNums - (IBAction)start:(id)sender { int i; for(i = 0; i < 10; ++i) { [outputNum setIntValue:i]; sleep(1); } } @end
它所做的就是等待9秒钟(显然是冻结的),然后在文本框中显示9.
要允许运行循环在消息之间运行,请使用NSTimer
或延迟执行.这是后者:
- (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]; }
这是一个基于计时器的解决方案.您可能会发现更容易理解.您可以从文本字段设置文本字段的值:
@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
这是一个使用属性的更好(更清洁)的基于计时器的解决方案.您需要将文本字段绑定到Interface Builder中的属性(选择字段,按⌘4,选择对象,然后输入currentNumber
作为要绑定的键).
@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
基于属性的解决方案至少有两个优点:
您的对象不需要知道文本字段.(它是一个模型对象,与作为文本字段的视图对象分开.)
要添加更多文本字段,只需在IB中创建并绑定它们即可.您不必向TestNums类添加任何代码.