2008-10-26 49 views
3

我是Objective-C的新手,所以可能有一個簡單的解決方案。Obj-C - >增加一個數字(並在Cocoa標籤上顯示步驟)

我想要一個數字增加,但每個迭代要顯示在標籤上。 (例如,它顯示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

相關問題