2011-02-02 11 views
1

NSTimerセレクタで[self setNeedsDisplay:YES]を呼び出して、drawRectメソッドをトリガしようとしました。その後NSTimer効果なし...?

- (void)drawRect:(NSRect)dirtyRect 
{ 
NSLog(@"drawRect"); 
} 

-(IBAction)buttonPush:(id)sender 
{ 
    myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 
    target:self 
    selector:@selector(myTimerAction:) 
    userInfo:nil 
    repeats:YES]; 
} 

-(void)myTimerAction:(NSTimer *) timer 
{ 
[self setNeedsDisplay:YES]; 
} 

"setNeedsDisplay" が正常に呼び出されたが、のdrawRect内のコードが呼び出されることはありません:

は最初に、私はボタンFUNCにNSTimerのinitコードを置きます私はNSTimerのinitコードを " - (id)initWithFrame:(NSRect)frame"に移動しようとしましたが、すべて正常に動作します。 (drawRectは1秒ごとに正しく呼び出されます)。

上記2つの方法の違いは何ですか? ボタンでタイマーをトリガーしたい場合はどうすればよいですか?

+0

説明からすべて正常に動作するはずです。バグや何が起こっているのかを何も示唆するものはありません。バグは他の場所です。より多くのコンテキストやコードを投稿する必要があります。 –

+0

アクションをボタンに接続することを忘れていないと思いますか?あなたの '-buttonPush:'メソッドにNSLogステートメントを入れて、それが出力されているかどうか確認してください。 –

答えて

1

そのコードはどのクラスにありますか?私はbuttonPush:アクションがコントローラの中にあると仮定しますか?

もしそうなら、あなたは持っている必要があります。

-(void)myTimerAction:(NSTimer *) timer 
{ 
    [[self view] setNeedsDisplay:YES]; 
} 

setNeedsDisplayのため:NSViewの、ないNSViewControllerの方法です。

(ところで、おそらくあなたはinitWithFrameの内側にそれを置けばそれが動作する理由:その1はNSViewの初期化子であるためがある:私はあなたがそこにコードを移動するときにもmyTimerActionを移動していることを推測しています:あなたはinitWithFrameを使用する場合、それは動作しますので、ビューを正しく参照「自己」を持っている方法)

+0

答えてくれてありがとうございますが、クラスコードはNSViewにあります。コードを「自己表示」に変更しようとするとエラーが表示されます: ".....応答していません - 閲覧" – supersurabbit

+0

もうおそらく明白なことを再現するが、私たちが同じページにいることを確認するには、View ControllerにbuttonPush:とmyTimerAction:を入れてください。カスタムビューの内側にはdrawRect:のままにしておきます。 myTimerActionの実装で上記のコードを使用すると、[self view] – ettore

0

は:,問題は、おそらくそのbuttonPushです:正しくフックアップされていません。 buttonPushでブレークポイントを設定してみてください。ボタンをクリックしたときに実際に呼び出されているかどうかを確認してください。

+0

を参照します。OPは[self setNeedsDisplay:]が実行されることを既に確認しました。 –