NSTimer没效果......?

时间:2011-02-02 07:35:08

标签: cocoa nsview nstimer appkit

我试图在NSTimer选择器中调用[self setNeedsDisplay:YES]以触发drawRect方法。

首先,我将NSTimer init代码放在按钮函数中:

-(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)frame”,然后一切正常。 (每1秒正确调用drawRect。)

上述两种方法有什么区别? 如果我想在一个按钮中触发Timer,我该怎么办?

2 个答案:

答案 0 :(得分:1)

只是想知道,该代码驻留在哪个类中?我假设 buttonPush:动作在控制器内部,对吗?

如果是这样,那么你应该:

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

因为setNeedsDisplay:是 NSView 的方法,而不是 NSViewController

(BTW可能是因为如果你把它放在 initWithFrame中的原因是因为那个是 NSView 初始化器:我猜你移动时那里的代码你也在移动 myTimerAction:方法,然后“ self ”正确引用视图。)

答案 1 :(得分:0)

因为它在你使用initWithFrame时起作用,所以问题可能是buttonPush:没有正确连接。尝试在buttonPush中设置断点:查看单击按钮时是否实际调用它。