問題の説明
私は、単純でかなり一般的であるべき何かを達成しようとしています: バインディングに NSPopupButton を設定し、バインディングに NSTableView を設定します。Apple は、ポップアップ メニューを使用した対 1 関係の実装のドキュメントで、セル ベースのテーブルについてこれを説明しており、次のようになっています。
ビューベースのテーブルでこれを機能させることはできません。「作成者」ポップアップは、何をしても表示されません。
テーブル内の項目 ( Items ) 用と作成者 ( Authors ) 用の 2 つの配列コントローラーがあり、どちらもコア データ モデルのそれぞれのエンティティに関連付けられています。インターフェイスビルダーで次のように、セルに NSManagedPopup をバインドします。
- コンテンツ->作成者(コントローラー キー: ArrangeObjects )
- コンテンツ値->作成者(コントローラー キー: ArrangeObjects、モデル キー パス: name )
- 選択したオブジェクト->テーブル セル ビュー(モデル キー パス: objectValue.author
ポップアップをテーブルの外のどこかに配置すると、正常に動作するので (明らかに選択を除いて)、バインディングのセットアップは問題ないと思います。
私がすでに試したこと
誰かがIBOutlet プロパティをAuthors配列コントローラーに使用する回避策を提案しましたが、これも私にはうまくいかないようです。
別のSOの質問では、NSTableCellViewをサブクラス化し、必要な接続をプログラムで確立することが提案されました。私はこれを試しましたが、限られた成功しかありませんでした。
次のようにバインディングをセットアップすると:
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { NSView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; if ([tableColumn.identifier isEqualToString:@"Author") { AuthorSelectorCell *authorSelectorCell = (AuthorSelectorCell *)view; [authorSelectorCell.popupButton bind:NSContentBinding toObject:self.authors withKeyPath:@"arrangedObjects" options:nil]; [authorSelectorCell.popupButton bind:NSContentValuesBinding toObject:self.authors withKeyPath:@"arrangedObjects.name" options:nil]; [authorSelectorCell.popupButton bind:NSSelectedObjectBinding toObject:view withKeyPath:@"objectValue.author" options:nil]; } return view; }
ポップアップには可能な作成者のリストが表示されますが、現在の選択は常に「値なし」と表示されます。追加すると
[authorSelectorCell.popupButton bind:NSSelectedValueBinding toObject:view withKeyPath:@"objectValue.author.name" options:nil];
現在の選択は完全に空です。現在の選択を表示する唯一の方法は、設定することです
[authorSelectorCell.popupButton bind:NSSelectedObjectBinding toObject:view withKeyPath:@"objectValue.author.name" options:nil];
プロパティに を割り当てようとするため、別の作成者を選択するとすぐに壊れ
NSString*
ますAuthor*
。
何か案は?