を。ここでは、あなたが既に持っているコードにこだわっ
はadvanceTimer
方法はそれを動作させるためにどのように見えるべきかです:
- (void)advanceTimer:(NSTimer *)timer
{
[countdown setIntegerValue:([countdown integerValue] - 1)];
if ([countdown integerValue] == 0)
{
// code to stop the timer
}
}
編集: 全体のことより、オブジェクト指向を行うには、との変換を避けるために文字列から数字とバックするたびに、私の代わりにこのようなものだろう:
// Controller.h:
@interface Controller
{
int counter;
IBOutlet NSTextField * countdownField;
}
@property (assign) int counter;
- (IBAction)startCountdown:(id)sender;
@end
を
// Controller.m:
@implementation Controller
- (IBAction)startCountdown:(id)sender
{
counter = 60;
NSTimer *countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(advanceTimer:)
userInfo:nil
repeats:YES];
}
- (void)advanceTimer:(NSTimer *)timer
{
[self setCounter:(counter -1)];
[countdownField setIntegerValue:counter];
if (counter <= 0) { [timer invalidate]; }
}
@end
そして、あなたはバインディングを利用することができるならば、あなたは単にテキストフィールドのintValue
Controller
のcounter
プロパティにバインドすることができます。これにより、クラスインターフェイスでIBOutlet
を削除し、advanceTimer
にsetIntegerValue:
行を削除することができます。
更新:タイマを実行ループに2回追加するコードを削除しました。そのエラーに気付いたNikolai Ruheとnschmidtに感謝します。
更新:setIntegerValue
メソッドを使用して、nschmidtのコードを簡略化しました。
編集:(空)advanceTimerの定義における誤植:(NSTimer *)タイマー...迷惑な「認識されていないセレクタがインスタンスに送信された」例外を発生させた
countdownTimerが実行ループに2回追加されていますが、これは間違っています。 –
@Nikolai Ruhe:それを指摘していただきありがとうございます。私は私の例から間違ったコードを削除しました。 –
setIntegerValueは[NSString stringWithFormat:]よりも効率的だと思いますので、この「最適化」は行っていません。特に、コードの明瞭性には役立ちません。 – nschmidt