2008-10-26 8 views
3

Я новичок в Objective-C, поэтому, возможно, это простое решение.Obj-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 в текстовом поле.

ответ

6

Чтобы разрешить цикл запуска между сообщениями, используйте команду 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 

Свойство-решение имеет по крайней мере два преимущества:

  1. Ваш объект не нужно знать о текстовом поле. (Это объект модели, отдельный от объекта вида, который является текстовым полем.)
  2. Чтобы добавить дополнительные текстовые поля, вы просто создаете и связываете их в IB. Вам не нужно добавлять код в класс TestNums.
4

Да, потому что это то, что вы сказали ему делать. Графики фактически не будут обновляться до тех пор, пока цикл основного запуска не будет свободен для их отображения. Вам нужно будет использовать NSTimer или какой-нибудь такой метод, чтобы делать то, что вы хотите.

Лучшим вопросом может быть, почему вы хотите это сделать?

+0

Это был просто пример, который был очень простым, чтобы продемонстрировать, что я хотел. – aaront 2008-10-26 05:57:27