3

Cocoa のバインディングで null プレースホルダーを (ローカリゼーションのために) 変更する方法はありますか?

バインドは、Interface Builder でポップアップ ボタン用に設定されます。IB でセットアップされたバインディングの双方向の性質が必要なので、プログラムでそれを行うことはあまり魅力的ではありません。

nib ファイルのローカリゼーションを処理する標準的な方法は、言語ごとに 1 つ作成することであることは承知していますが、言語バージョン間の nib ファイル全体の違いはこれだけなので、単一の文字列には少し過剰に思えます。

awakeFromNibIB で作成されたバインディングを変更する方法があれば、ファイルの所有者のメソッドでそれを行うことを考えていました。

4

3 に答える 3

5

NSDocument クラスなど、バインド先のコントローラー オブジェクトで、 override -bind:toObject:withKeyPath:options:. これは、そのメソッド呼び出しのターゲットである必要があります – nib のBind to:で選択したオブジェクトです。

NSObjectController または NSArrayController にバインドする場合は、サブクラスが必要になります。

そのメソッドは、options辞書を書き換えて super を呼び出し、の値をNSNullPlaceholderBindingOptionローカライズされた文字列に置き換えます。

もちろん、代わりにそのキーに渡された値を取得して変換することもできますが、nib から null プレースホルダーとコード内のそのキー値を省略します。

于 2012-06-15T15:40:48.557 に答える
0

NSPopUpButtonバインディングを使用する で、null プレースホルダー文字列 (つまり、「値なし」) を変更できました。

具体的には、オブジェクトがnil. null プレースホルダー メニュー項目が選択された場合、空のNSStringorがユーザーの既定値に保存されます。nil

NSPopUpButton バインディング:

  • コンテンツNSArrayController.arrangedObjects

  • コンテンツ オブジェクトはバインドされ ていますNSArrayController.arrangedObjects.exampleContentObject( NSString)。これは、メニュー項目が表すオブジェクトでありSelected Object

  • Content ValuesNSArrayController.arrangedObjects.exampleContentValueは( ) にバインドされNSStringます。これは、ポップアップ ボタンのメニュー項目に表示されるタイトルです。

  • ポップアップ ボタンの選択されたオブジェクトは、および( ) とNSSharedUserDefaultsController.values.ExampleUserDefaultsKey同じオブジェクト タイプにバインドされます。このオブジェクトは、バインディングで指定された NSUserDefault のキーのオブジェクト タイプと一致する必要があります。ポップアップ ボタンから項目を選択すると、選択したオブジェクトがユーザーの既定値に保存されます。Content ObjectsSelected ObjectNSString

null プレースホルダー文字列を "No Value" から別のものに変更するには、サブクラス化NSPopUpButtonしてオーバーライドします-[NSPopUpButton bind:toObject:withKeyPath:options:]


@interface CustomPopUpButton : NSPopUpButton
@end

@implementation CustomPopUpButton
- (void)bind:(NSString *)binding toObject:(id)observable withKeyPath:(NSString *)keyPath options:(NSDictionary<NSString *,id> *)options {
    NSMutableDictionary *mutableOptions = options ? [options mutableCopy] : [NSMutableDictionary dictionaryWithCapacity:1];
    mutableOptions[NSInsertsNullPlaceholderBindingOption] = @YES;
    mutableOptions[NSNullPlaceholderBindingOption] = @"Custom Null Placeholder Text";
    [super bind:binding toObject:observable withKeyPath:keyPath options:[mutableOptions copy]];
}
@end

最後に、NSPopUpButtonInterface Builder で を選択し、Xcode Identity Inspector の Custom ClassNSPopUpButtonの下で、クラスをサブクラスにします。

于 2018-09-13T21:33:58.953 に答える