2

パネル内に毎秒起動しようとしているタイマーがありますが、起動できないようです。私は次のようにパネルを作成しています:

// 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

残念ながら、タイマーが起動しないと、テーブルにエントリがまったくありません。

以下は、まさに私がやろうとしていることのスクリーンショットです (エントリはメイン配列に直接追加されています)。

ここに画像の説明を入力

4

1 に答える 1

0

コードは正しいようです。実行ループに問題がある可能性があります。scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: を使用してみてください。

于 2012-01-17T08:20:47.580 に答える