1

MonoMac を使用して、C# で Mac 用のデスクトップ ダウンロード マネージャーを作成しています。

私のXIBにはテーブルビューがあり、その列はにバインドされていNSArrayControllerます。アレイ コントローラは、 を介してメイン ウィンドウ コントローラに接続されていIBOutletます。配列には、HttpDownloadから派生した一連のオブジェクトが保持されNSObjectます。これらのHttpDownloadオブジェクトにはTotalSizeTotalDownloadedBandwidth、 などのプロパティが含まれています。これらのプロパティを属性で装飾しました[Export]

NSArrayControllerコントローラーで、メソッドを使用していくつかの HttpDownload オブジェクトを追加しますAddObject。で開始されるバックグラウンド プロセスTask.Factory.StartNew()は、ダウンロードを非同期的に開始し、データが受信されると TotalDownloaded や Bandwidth などのバインドされたプロパティを更新します。

これらの新しい値がテーブル ビューに反映されているのを確認できますが、UI の更新を「強制」したのは 1 回だけです。たとえば、ウィンドウのフォーカスを失ったり、フォーカスを取得したり、ウィンドウ内のボタンをクリックしたりします。

IB で Continuously Updates Value を設定しようとしましたが、これは違いはありません (ドキュメントを読んでも、そうすべきだとは思いませんでした)。

ウィンドウイベントが発生したときだけでなく、バ​​インドされた値を「リアルタイム」でUIに更新させることを知っている人はいますか?

4

1 に答える 1

3

この質問を投稿した直後にこれを理解しました。

たとえば、ダウンロードした合計を更新したときなど、更新されているキーの少なくとも 1 つに対して手動でWillChangeValue()andを呼び出す必要があるようです。DidChangeValue()

WillChangeValue("DownloadedBytes");
DownloadedBytes += bytesRead;
DidChangeValue("DownloadedBytes");

私の場合、更新されたキーの 1 つだけに対してこれらのメソッドを呼び出すだけで、すべてのバインドされた値の更新を強制するのに十分なようです。

参考までに、Objective-C では、これらのセレクターは および と呼ば[self willChangeValueForKey:@"keyname"][self didChangeValueForKey:@"keyname"]ます。

于 2012-12-03T13:07:56.327 に答える