NSApp.dockTileのバインディングを作成する方法
-
03-07-2019 - |
質問
IBでは、ラベルまたはテキストフィールドをコントローラーのkeyPathに簡単にバインドできます。
NSDockTile([[NSApp dockTile] setBadgeLabel:@" 123"]で利用可能)がIBに表示されず、プログラムでその「badLabLabel」をバインドする方法がわかりません。ラベル/テキストフィールド/テーブル列をバインドするようなプロパティ。
アイデアはありますか
解決
NSDockTileにはバインディングがないため、コントローラーでドックタイルを手動で更新する必要があります。 KVOを使用してこれを行うことができます。KVOをバインドすると同じ効果があります。
グローバルとしてコンテキストを作成します:
static void* MyContext=(void*)@"MyContext";
次に、initメソッドで:
[objectYouWantToWatch addObserver:self forKeyPath:@"dockTileNumber" options:0 context:MyContext];
次に、このメソッドを実装して、キーパスの変更を通知する必要があります。
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == MyContext) {
[[NSApp dockTile] setBadgeLabel:[object valueForKeyPath:keyPath]];
}
else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}
コントローラーオブジェクトがなくなったら、オブザーバーを削除するようにしてください。
他のヒント
NSDockTileがバインディングをサポートしている場合、 bind:toObject:withKeyPath:options:
メソッドを使用して、badgeLabelプロパティにバインディングを設定できます。使用する引数の詳細については、ドキュメントを確認してください。動作しない場合は、コントローラークラスでキー値監視を実装し、値が変更されるたびにラベルを更新するか、NSDockTileをオーバーライドしてバインディング互換サブクラスを作成することもできます。
NSDockTile、コントローラー、データソースで bind:toObject:withKeyPath:options:
のバリエーションを多数試しました。機能する組み合わせがわかりません。あるいは、データソースにバインドできるBatchControllerオブジェクトを作成し、バッジを更新する方法はありますか? NSObjectを取得してバインド可能にするにはどうすればよいですか?