NSTimer与代理方法

3

我想在代理上设置一个NSTimer - 我对Objective-C非常陌生,所以如果这不太好理解,请见谅。但是我写的代码如下:

animationTimer = [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval)((1.0 / 60.0) * animationFrameInterval) target:self.delegate selector:@selector(drawView) userInfo:nil repeats:TRUE];

很不幸,这并不起作用。有人能指点我正确的方向吗?我的大脑已经烧坏了!!


抱歉,崩溃报告中出现的错误是这样的: [mugalugAppDelegate drawView]: 无法识别的选择器发送到实例这意味着它找不到该方法,对吗? - FlimFlam
2个回答

4
很可能drawView方法的签名不正确。从NSTimer类参考文档可以看出:

定时器触发时发送给目标的消息。选择器必须具有以下签名:

- (void)timerFireMethod:(NSTimer*)theTimer

因此,你的drawView方法应该如下所示:

- (void)drawView:(NSTimer*)theTimer
{
// Draw the view
}

此外,将您的代码更正为以下内容(请注意“drawView”后面的冒号):
animationTimer = [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval)((1.0 / 60.0) * animationFrameInterval) target:self.delegate selector:@selector(drawView:) userInfo:nil repeats:TRUE];

顺便提一下,我不确定你的drawView负责什么(我猜是绘制视图)。然而,有内置机制可用于绘制,应该遵循这些机制(除非是极为特殊的情况)。通常,如果你有一个NSView,你会调用setNeedsDisplay,这将导致UI告诉你的NSView通过调用你的NSView的drawRect:来重新绘制自己。我之所以提到这一点,是因为你说你是Objective-C的新手,所以你可能不知道这一点,最终写出比你需要的更多的代码。如果你遵循这个设计,你可以让你的计时器定期调用setNeedsDisplay


3

你做对了。

只需要在方法名中加入一个冒号,即@selector(drawView:)。此外,按照惯例,Objective-C编码人员使用YES和NO。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接