私は毎秒発砲しようとしているパネルの中にタイマーを持っていますが、発射することはできません。私はそうのように私のパネルを作成しています:シートウィンドウの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
が、私はすべてのテーブルにエントリを取得していません。以下は
は、(エントリがメインアレイに直接追加されました。)私がやろうとしています正確に何のスクリーンショットです
私はあなたが誤ったランループを取得している可能性があります。メインrunloopはシートウィンドウでは機能しません。独自のシートがあります。 awakeFromNib [NSRunLoop currentRunLoop]にメインrunloopがないことを確認してください。もしそうなら、私はawakeFromNibではなく、後で正しいrunloopを取得しようとします。 – Davyd
とにかくモーダルシートにタイマーが必要なのはなぜですか? – Davyd
私は何をしているのかを正確に説明しようと、詳細を追加しました。また、私はawakeFromNibではなく、まだ運がないとwindowDidLoadにタイマーコードを移動しようとしました。 – Kyle