Objective c 板材窗口中的NSTimer未触发
我在一个面板里有一个计时器,我试图每秒钟启动一次,但我似乎无法启动它。我正在创建我的面板,如下所示:Objective c 板材窗口中的NSTimer未触发,objective-c,cocoa,nstimer,nsrunloop,cocoa-sheet,Objective C,Cocoa,Nstimer,Nsrunloop,Cocoa Sheet,我在一个面板里有一个计时器,我试图每秒钟启动一次,但我似乎无法启动它。我正在创建我的面板,如下所示: // Begin our sheet [NSApp beginSheet: targetController.window modalForWindow: self.window modalDelegate: self didEndSelector: nil contextInfo: nil]; 然后在我的targetController中,我有以下内容: -
// Begin our sheet
[NSApp beginSheet: targetController.window
modalForWindow: self.window
modalDelegate: self
didEndSelector: nil
contextInfo: nil];
然后在我的targetController中,我有以下内容:
- (void) awakeFromNib
{
NSLog(@"awakeFromNib.");
displayUpdateTimer = [NSTimer timerWithTimeInterval: 1.0
target: self
selector: @selector(updateDisplay:)
userInfo: nil
repeats: TRUE];
[[NSRunLoop currentRunLoop] addTimer: displayUpdateTimer
forMode: NSModalPanelRunLoopMode];
}
我的理解是,通过添加带有nsmodalpanelrunlopmode
的计时器,我做到了这一点,但是即使这样做,我的updateDisplay:selector也不会被触发
有人知道我做错了什么吗
注意:我也尝试过NSDefaultRunLoopMode
,但没有什么不同。计时器仍然没有启动
编辑:我的总体目标如下-
我的面板有一个表视图,可以一次(从多个线程)向其中添加多个项目。因此,我将这些项添加到一个临时数组中,然后当计时器启动时,它将临时数组中的项添加到主数组并重新加载表。下面是执行此操作的代码示例:
- (void) addOverwriteObject: (id) overwriteObject
{
@synchronized(newObjects)
{
// Add our overwrite object
[newObjects addObject: overwriteObject];
} // End of overwriteObject
} // End of addOverwriteObject
以及计时器更新时激发的方法:
- (void)updateDisplay:(id)sender
{
@synchronized(newObjects)
{
if(newObjects.count > 0)
{
[overwriteObjects addObjectsFromArray: newObjects];
[newObjects removeAllObjects];
[tableView reloadData];
} // End of newObjects has entries
} // End of newObjects sync
} // End of updateDisplay
不幸的是,没有定时器触发,我在表中根本没有任何条目
下面是我正试图做的截图(条目已直接添加到主数组。)
您的代码似乎正确,运行循环可能存在问题。请尝试使用scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:。您的代码似乎正确,运行循环可能存在问题。请尝试使用scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:。我猜您可能得到了错误的运行循环。主runloop在工作表窗口中不工作,它有自己的窗口。确保未在awakeFromNib[NSRunLoop currentRunLoop]中获取主runloop。如果是这样的话,我会尝试在awakeFromNib中获取正确的runloop,而不是在awakeFromNib中,而是稍后。无论如何,为什么在模式表中需要一个计时器呢?我添加了更多的细节,试图准确地解释我在做什么。我还尝试将计时器代码移动到windowDidLoad而不是从NIB唤醒,但仍然没有成功。为什么不在这里使用MVC模式,当模型实际更改时,模型会发布通知,控制器订阅通知并更新表视图?如果出于其他原因,您希望保留现有的实现,请尝试使用
[self-performSelector:withObject:afterDelay:][/code>而不是计时器。显示窗口后,在updateDisplay
方法的末尾调用;当然有退出条件。我猜你可能得到了一个错误的运行循环。主runloop在工作表窗口中不工作,它有自己的窗口。确保未在awakeFromNib[NSRunLoop currentRunLoop]中获取主runloop。如果是这样的话,我会尝试在awakeFromNib中获取正确的runloop,而不是在awakeFromNib中,而是稍后。无论如何,为什么在模式表中需要一个计时器呢?我添加了更多的细节,试图准确地解释我在做什么。我还尝试将计时器代码移动到windowDidLoad而不是从NIB唤醒,但仍然没有成功。为什么不在这里使用MVC模式,当模型实际更改时,模型会发布通知,控制器订阅通知并更新表视图?如果出于其他原因,您希望保留现有的实现,请尝试使用[self-performSelector:withObject:afterDelay:][/code>而不是计时器。显示窗口后,在updateDisplay
方法的末尾调用;当然有退出条件。