我试图在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,我该怎么办?
答案 0 :(得分:1)
只是想知道,该代码驻留在哪个类中?我假设 buttonPush:动作在控制器内部,对吗?
如果是这样,那么你应该:
-(void)myTimerAction:(NSTimer *) timer
{
[[self view] setNeedsDisplay:YES];
}
因为setNeedsDisplay:是 NSView 的方法,而不是 NSViewController 。
(BTW可能是因为如果你把它放在 initWithFrame中的原因是因为那个是 NSView 初始化器:我猜你移动时那里的代码你也在移动 myTimerAction:方法,然后“ self ”正确引用视图。)
答案 1 :(得分:0)
因为它在你使用initWithFrame时起作用,所以问题可能是buttonPush:没有正确连接。尝试在buttonPush中设置断点:查看单击按钮时是否实际调用它。