助けてください、これは私を怒らせています:(
私が書いているOSX Cocoaアプリの一部として、NSPopUpButtonを使用して作成/編集しているレコードのタイプを選択するフォームがあります。
バインドを使用してポップアップ ボタンを配列コントローラーにバインドしていますが、選択した値は NSString にバインドされています。
ポップアップにデータが入力され、アイテムを選択してレコードを保存できますが、うまくいかないことが 2 つあります。
1) 選択された値オブジェクトには、アイテムのキーではなくテキスト名が含まれています - コンテンツ オブジェクト バインディングを設定しました
2) フォームのリロード時にポップアップの選択項目を復元できません。
参考になるコード サンプルを次に示します。
@実装スニペット:
IBOutlet NSPopUpButton *popMediaType;
IBOutlet NSArrayController *acMediaTypes;
@property (nonatomic, copy) NSString *selMediaType;
@インターフェーススニペット:
- (void)setupForm {
NSArray *types = [[NSArray alloc] initWithObjects:[NSDictionary dictionaryWithObjectsAndKeys:@"Video", @"name", @"video", @"value", nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"Advert", @"name", @"advert", @"value", nil],
[NSDictionary dictionaryWithObjectsAndKeys:@"Graphic", @"name", @"graphic", @"value", nil],
nil];
[acMediaTypes setContent:types];
}
インターフェースビルダーで:
acMediaTypes は、mediaTypes という配列コントローラー オブジェクトの参照アウトレットです。 popMediaType は、フォーム上の NSPopUpButton の参照アウトレットです。
私の NSPopUpButton のバインディングは次のように構成されています。
Content (mediaTypes.arrangedObjects)
Bind to: mediaTypes
Controller Key: arrangedObjects
Model Key Path: <null>
Content Objects (mediaTypes.arrangedObjects)
Bind to: mediaTypes
Controller Key: arrangedObjects
Model Key Path: value
Content Values (mediaTypes.arrangedObjects)
Bind to: mediaTypes
Controller Key: arrangedObjects
Model Key Path: name
Selected Value (File's Owner.selMediaType)
Bind to: Files Owner
Controller key: <null>
Model Key Path: selMediaType
ポップアップが正しく表示され、配列の「名前」部分のテキストが正しく表示されます。
NSLog() のようなものを使用してコードを読み取るselMediaType
と、たとえば、そのアイテムが選択されている場合は「ビデオ」が表示されます-「ビデオ」である必要があります (辞書の「値」部分の小文字)
問題なく値を sqlite データベースに保存し、ターミナルから sqlite3 を使用して値を検査すると、すべてが保存されます。
テーブルから値をロードすると、設定selMediatype
するだけで NSPopUpButton のアイテムの位置がリセットされると思っていましたが、そうではありません。