Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 板材窗口中的NSTimer未触发_Objective C_Cocoa_Nstimer_Nsrunloop_Cocoa Sheet - Fatal编程技术网

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
方法的末尾调用;当然有退出条件。