当前位置:  开发笔记 > IOS > 正文

Obj-C - >增加一个数字(并在Cocoa标签上显示步骤)

如何解决《Obj-C->增加一个数字(并在Cocoa标签上显示步骤)》经验,为你挑选了1个好方法。

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



1> Peter Hosey..:

要允许运行循环在消息之间运行,请使用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类添加任何代码.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有