2011-01-23 11 views
10
私が作成してい

後に繰り返し、発射ないNSTimerで:いくつかのためにiPhoneは - NSTimerは火

@property (nonatomic, retain) NSTimer *ncTimer; 

:私は私のタイマーを保持しています

ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
              target:self 
             selector:@selector(handleTimer:) 
             userInfo:nil 
              repeats:YES]; 
[ncTimer fire]; 

- (void)handleTimer:(NSTimer *)chkTimer { 
    // do stuff 
} 

タイマーが繰り返されない理由。それは一度だけ発砲しており、もう一度発射されていません。

+0

私の部分に愚かな質問が、それは確かにベストです:*私はあなたがhandleTimerメソッド内の任意の場所タイマーを無効にしていないと推定? –

+0

いいえ私が追加しなければならないのは、viewDidLoadメソッドでタイマーを起動していることです。 – Zigglzworth

答えて

7

あなたはちょうどあなたがあなたのヘッダー内のプロパティとして入れているタイマーに割り当てることはできません。これは正常に動作するはずです:

self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES];

また、次のようになります。タイマーが繰り返されない場合、タイマーは無効になります。火災の行の後に、これを追加します。


BOOL timerState = [ncTimer isValid]; 
NSLog(@"Timer Validity is: %@", [email protected]"YES":@"NO"); 
+1

「タイマーの有効期間は:はい」ですが、まだ運がない...タイマーが繰り返されていません。何が問題なの? – Zigglzworth

+0

私はちょうど何が起こったかを見るために少しテストアプリを作った、それは自己と一緒に私のために正常に働いた。 @synthesize ncTimerは実装の先頭にありますか? –

+0

ええ、私はそれを持っている...私は多くの他のアプリでこれをやったので、何が間違っているのか分からない。 – Zigglzworth

3

ncTimerに割り当てると、プロパティretainが開始されません。宣言を想定し

は、あなたが行う必要がありますメンバーオブジェクト内にある:

self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES] 
+0

自分自身を追加しました。問題が続く場合 – Zigglzworth

34

-fire:メソッドを手動で1回起動します。開始し、リピートするタイマーのために、あなたは[[NSRunLoop currentRunLoop] addTimer: forMode:]

+14

これは正しいですが、手動で実行ループに追加するのではなく、 'NSTimer'' scheduleTimerWith ... ' 。 –

19

を使用して実行ループに追加する必要がありmainRunLoopにタイマーを追加する

が、それはここで

作業作られたそれはあなたが行くガット:

のObjective C :

self.ncTimer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 

スウィフト:

var ncTimer = NSTimer(timeInterval: 2.0, target: self, selector: Selector("handleTimer"), userInfo: nil, repeats: true) 
NSRunLoop.mainRunLoop().addTimer(ncTimer, forMode: NSDefaultRunLoopMode) 
+0

'self.ncTimer'の代わりに' NSTimer * ncTimer'を目的Cとしませんか?また、 'addTimer:timer'の代わりに' addTimer:ncTimer'と言うことはありませんか?私はこれを編集する権限を持っていますが、何をする必要があるかを知ってほしかったのです。 – Volomike

+0

私も、これは私のために働いたが、 'scheduleTimerWithTimeInterval'は – Husam

6

このブロック内にコードをコピーして、メインスレッドにタイマーの作成を挿入することもできます。

コードがゆえのままになります:*

dispatch_async(dispatch_get_main_queue(), ^{ 
    self.ncTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
       target:self selector:@selector(handleTimer:) userInfo:nil repeats: YES]; 
}); 
関連する問題