2008-10-26 3 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을 입력해야합니다).

  1. 개체가 텍스트 필드에 대해 알 필요가 없다 :

    @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 
    

    속성 기반 솔루션은 적어도 두 가지 장점이있다. (모델 객체이며 텍스트 필드 인 뷰 객체와 분리되어 있습니다.)

  2. 텍스트 필드를 더 추가하려면 IB에서 텍스트 필드를 만들고 바인딩하기 만하면됩니다. TestNums 클래스에 코드를 추가 할 필요가 없습니다.
4

예, 그렇게 말했기 때문입니다. 그래픽은 주 실행 루프가 자유롭게 표시 할 때까지 실제로 업데이트되지 않습니다. 원하는 것을 수행하려면 NSTimer이나 그런 방법을 사용해야합니다.

더 좋은 질문은 왜 이렇게 할 수 있을까요?

+0

이것은 내가 원하는 것을 보여주기 위해 매우 단순한 예였습니다. – aaront