0

だからここに私が持っているものがあります:

  • NSMutableArray データ ソースを持つ NSTableView
  • テーブル ビューのデータを含むファイルを含むフォルダーを監視する FSEvents ( Objective-C 抽象化の良さのためにSCEventsを使用)
  • FSEvents は、UI のリロード ボタンと同じ機能をトリガーします。この関数は、上記のファイルの内容に基づいて、新しいデータ ソースでテーブル ビューを更新しますsetDataSource:

そして、何が起こるかは次のとおりです。

  • ファイルに変更を加えると、FSEvent がトリガーされ、refresh メソッドが呼び出されます。
  • テーブル ビューが受け入れる配列には、FSEvent をトリガーした変更が実際に含まれています。
  • setDataSource:正しいデータソースで NSTableView に送信されます。
  • 変更はテーブル ビューに表示されません。

しかしその後:

  • 更新ボタンをクリックすると、FSEvent とまったく同じメソッドがトリガーされ、テーブル ビューが新しいデータで更新されます。

FSEvent を NSNotification( NSApplicationDidBecomeActiveNotification) に置き換えてみましたが、同じことが起こります。

なぜこれが起こっているのか誰にも分かりますか?

編集:明確にするために、私の質問の主旨は次のとおりです:ボタンを押すとトリガーされたときに NSTableView がリロードされるのはなぜですか?

編集: diciuのおかげで、実際には、イベントによってトリガーされたときにすべての UI 参照が 0x0 を指しているが、ボタンのクリックによってトリガーされたときに有効なアドレスを持っていることがわかりました。これらのオブジェクトはすべて IB で宣言されているため、私のコードではインスタンス化や割り当ては行われません。だから私の質問は今です:これらのポインターがnilを指すのを止めるにはどうすればよいですか?

4

5 に答える 5

2

テーブルに追加/削除する新しいデータがある場合は、NSTableView でreloadDataを呼び出します。

これは、NSTableView を強制的に再描画するのに役立つ場合があります。

これがあなたの求めているものかどうかはよくわかりません。あなたの質問の言葉遣いはややこしいです。あなたは一連の出来事を述べていますが、決して本当の質問ではありません。

于 2008-11-30T02:29:35.900 に答える
1

NSArrayテーブルビューのデータソースとして直接設定していますか?

それはどのようにNSTableView機能するかではありません。データソースは、に準拠するオブジェクトである必要がありますNSTableDataSourceNSArrayそうではありません。データソースは自分で作成します。おそらく、現在呼び出しているのと同じオブジェクトになりますsetDataSource:

もう1つの方法は、バインディングを使用することです。

于 2008-11-30T07:23:31.703 に答える
1

実行ループの 2 回目のパスで FSEvent からメソッドを呼び出してみましたか?

[myObject performSelector:@selector(reloadAction:) withObject:nil afterDelay:0.0];
于 2008-11-30T02:29:17.380 に答える
1

refresh メソッドのスコープ内でのテーブル ビューへの参照が無効である可能性はありますか?

つまり、エラーを発生させない [nil reloadData] を呼び出していないということですか? awakeFromNib の前またはその他の状況で設定されている場合、更新コードでテーブル ビューへの参照が nil になる可能性があります。

于 2008-11-30T08:56:47.380 に答える
1

イベント/通知に登録するとき、コントローラークラスの別のインスタンスを渡しているように聞こえます。

于 2008-11-30T23:43:04.970 に答える