2012-01-16 14 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]にメインrunloopがないことを確認してください。もしそうなら、私はawakeFromNibではなく、後で正しいrunloopを取得しようとします。 – Davyd

+0

とにかくモーダルシートにタイマーが必要なのはなぜですか? – Davyd

+0

私は何をしているのかを正確に説明しようと、詳細を追加しました。また、私はawakeFromNibではなく、まだ運がないとwindowDidLoadにタイマーコードを移動しようとしました。 – Kyle

答えて

0

あなたのコードが正しいと思われる、との問題がある可能性がありますループを実行します。scheduledTimerWithTimeIntervalを使用して実行します。target:selector:userInfo:repeats:

関連する問題