2012-01-16 50 views
2

我在面板中有一个计时器,我试图每秒触发一次,但是我似乎无法启动它。我创造我的面板像这样:NSTimer在工作表窗口中没有触发

// 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]; 
} 

我的理解是,我通过与NSModalPanelRunLoopMode增加计时器正确地这样做,但是,即使这样做,我的updateDisplay:选择器永远不会被解雇。

有没有人有什么我在做什么错在这里?

注意:我也试过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 

不幸的是不定时点火,我在表中得到任何项目都没有。

下面是正是我试图做一个屏幕截图(条目已直接添加到主阵列。)

enter image description here

+0

我的猜测是你可能会得到一个错误的runloop。主循环不能在工作表窗口中工作,它有它自己的一个。确保你没有在awakeFromNib [NSRunLoop currentRunLoop]中获得主循环。如果是这样,我会尝试在awakeFromNib中得到正确的runloop,但是稍后。 – Davyd 2012-01-17 03:54:25

+0

无论如何,你为什么需要模态表中的计时器? – Davyd 2012-01-17 03:55:38

+0

我添加了更多的细节来尝试和解释我正在做什么。此外,我尝试将计时器代码移到windowDidLoad而不是awakeFromNib,但仍然没有运气。 – Kyle 2012-01-17 12:20:02

回答

0

您的代码似乎是正确的,则可能是问题运行loop.Try using scheduledTimerWithTimeInterval:target:selector:userInfo:repeatats :.