目标 C语言 Obj-C -> 递增数字(并在可可标签上显示步骤)



我是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

这是一个更好(更干净)的基于计时器的解决方案,使用属性。您需要将文本字段绑定到界面生成器中的属性(选择字段,按 ⌘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

基于属性的解决方案至少有两个优点:

  1. 您的对象不需要知道文本字段。(它是一个模型对象,独立于作为文本字段的视图对象。
  2. 要添加更多文本字段,您只需在 IB 中创建并绑定它们即可。您不必向 TestNums 类添加任何代码。

是的,因为这就是你告诉它要做的。在主运行循环可以自由显示图形之前,图形不会实际更新。您需要使用NSTimer或一些此类方法来执行所需的操作。

一个更好的问题可能是你为什么要这样做?

最新更新