要允許運行循環在消息之間運行,請使用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類添加任何代碼。
這只是一個非常簡單的例子,可以證明我想要發生的事情。 – aaront 2008-10-26 05:57:27