1

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

起初,我将 NSTimer 初始化代码放在一个按钮函数中:

-(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 初始化代码移动到“- (id)initWithFrame:(NSRect)frame”,然后一切正常。(drawRect每1秒正确调用一次)。

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

4

2 回答 2

1

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

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

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

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

(顺便说一句,如果你把它放在initWithFrame:里面可能它起作用的原因是因为那个是一个NSView初始化程序:我猜当你把代码移到那里时,你也在移动myTimerAction:方法,然后它有“ self ”正确引用视图。)

于 2011-02-04T20:19:51.937 回答
0

由于它在您使用 initWithFrame: 时有效,因此问题可能是 buttonPush: 未正确连接。尝试在 buttonPush: 中设置断点:查看单击按钮时是否实际调用它。

于 2011-02-10T11:07:19.037 回答