Frage

Ich bin neu mit Objective-C, so dass es wahrscheinlich ist eine einfache Lösung für dieses Problem.

Ich mag eine Zahl zu erhöhen, aber jede Iteration Show wird auf einem Etikett. (Beispielsweise zeigt sie 1, 2, 3, 4, 5 ... angezeigt, um einen Betrag der Zeit auseinander).

Ich habe versucht:

#import "testNums.h"

@implementation testNums
- (IBAction)start:(id)sender {
    int i;
    for(i = 0; i < 10; ++i)
    {
        [outputNum setIntValue:i];
        sleep(1);
    }
}
@end

und alle es taten, war für 9 Sekunden warten (scheinbar eingefroren) und dann angezeigt 9 in das Textfeld ein.

War es hilfreich?

Lösung

die Laufschleife zu ermöglichen, führen zwischen Nachrichten, verwenden Sie einen NSTimer oder verzögert ausgeführt werden. Hier ist dieser:

- (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];
}

Hier ist eine Timer-basierte Lösung. Sie können es einfacher finden zu folgen. Sie könnten den Textfeldwert aus dem Textfeld gesetzt:

@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

Hier ist eine noch bessere (Reiniger) Timer-basierte Lösung, eine Eigenschaft. Sie müssen das Textfeld auf die Eigenschaft im Interface Builder (wählen Sie das Feld, drücken Sie ⌘4, wählen Sie Ihr Objekt und geben Sie currentNumber als Schlüssel zu binden) binden.

@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

Die eigenschaftsbasierte Lösung hat mindestens zwei Vorteile:

  1. Ihr Objekt muss sich nicht um das Textfeld kennen. (Es ist ein Modellobjekt, getrennt von der Ansicht Objekt, das das Textfeld.)
  2. Um mehr Textfelder hinzufügen, können Sie einfach erstellen und binden sie in IB. Sie haben noch keinen Code in der TestNums Klasse hinzufügen.

Andere Tipps

Ja, denn das ist, was Sie ihm gesagt, zu tun. Die Grafik wird nicht wirklich aktualisieren, bis die Hauptlaufschleife frei ist, um sie anzuzeigen. Sie werden NSTimer oder eine solche Methode verwenden, müssen zu tun, was Sie wollen.

Eine bessere Frage wäre, warum Sie dies tun wollen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top