Я новичок в 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 или другой подобный метод, чтобы делать то, что вы хотите.
Может быть, лучше спросить, зачем вам это нужно?
Чтобы позволить циклу выполнения запускаться между сообщениями, используйте 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
Решение на основе собственности имеет как минимум два преимущества:
Это был просто пример, который очень просто продемонстрировал то, что я хотел.