2011-02-02 195 views
1

我試圖在NSTimer選擇器中調用[self setNeedsDisplay:YES]來觸發drawRect方法。NSTimer沒有影響...?

起初,我把的NSTimer初始化代碼的FUNC鍵:

-(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中的代碼不會被調用:

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

然後我試圖將NSTimer init代碼移動到「 - (id)initWithFrame:(NSRect)框架」,然後一切正常。 (drawRect每1秒正確調用一次)。

以上兩種方法有什麼區別? 如果我想在按鈕中觸發定時器,我該怎麼辦?

+0

從描述中,一切都應該正常工作。沒有錯誤或任何暗示發生了什麼問題。該錯誤在別處。你必須發佈更多的上下文或代碼。 – 2011-02-08 14:21:16

+0

我假設你沒有忘記將動作連接到你的按鈕?嘗試在你的`-buttonPush:`方法中放一個NSLog語句,看看它是否被輸出。 – 2011-02-10 10:16:40

回答

1

想知道,代碼駐留在哪個類中?我會假設buttonPush:動作是在控制器裏面,對嗎?

如果是這樣,那麼你應該有:

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

因爲setNeedsDisplay:是的方法的NSView,不NSViewController

(順便說一句也許就是爲什麼它的工作原理,如果你把它裏面initWithFrame的原因:是因爲一個是的NSView初始化:我猜,當你有移動的代碼,你也動myTimerAction :方法,然後有「自我」正確地引用視圖)

+0

感謝您的答案,但類代碼是在NSView中,如果我嘗試將代碼更改爲「自我查看」,我會得到一個錯誤:「.....沒有迴應 - 查看」 – supersurabbit 2011-02-10 01:24:33

0

由於它的工作原理,當你使用initWithFrame :,問題可能是buttonPush:不掛鉤正確。試着在buttonPush中設置一個斷點:當你點擊按鈕時,看它是否被實際調用。