FC2ブログ

頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


NSTableViewにNSPopupButtonを置く

macOSでNSPopUpButtonとたわむれる
↑この続き。
上記の記事でNSPopupButtonを使ったがこれは言わば練習で、元々はこれをテーブルで使いたかった。

ところが、単純にstoryboradでNSTableViewのセルのところにNSPopupButtonを置いてもうまくいかない。
テーブルなので複数行のNSPopupButtonオブジェクトができた時にそれぞれのボタンが何を示しているかを得るのが難しい(※1)。
NSpopupButtonの参照を得ようとoutlet繋いでも複数はあかんってエラー出るし。


調べたところ、こういう記事が↓
cocoa - Pop up Button in view based NSTableView - Stack Overflow

このページにあるリンク先のpopTestプロジェクトをダウンロードして動かしてみると、、、

popTestスクショ

そうそう、こういう風にしたいのだよ!

ところが、このプロジェクトをよく見るとxibファイルに記述しててstoryboardを使っていない。

部品構成(xibファイルの場合)

↑xibファイルを選択するとこうなってるんだが、、、
ちょっ、、え?storyboardでやるのはどうすんの?なんか勝手が違うやん、、、?

結局、、、参考ページのプロジェクトと部品の構成を同じにてBindingsの設定をあーでもない、こーでもないと試行錯誤しまくったのだが、、、やっぱりダメ。

ようやく気付いたのが、Array Controller(NSArrayController)をstoryboard上で部品としてLibrary(※2)から追加できること(※3)。

LibraryでArray Controllerを選択

↑arrayとかで見つかるのでこれをドラッグ&ドロップ。

さらに追加したArray Controllerで
1. Connections inspector(※4)でoutletを接続
2. Bindings inspector(※5)のContent Arrayを設定

これで無事参考ページと同等のことができた。

これだとNSTableViewDataSource、NSTableViewDelegateのどちらもコードで設定してない。面白いなあ。

しかもこの方法でも、Connections inspectorでNSPopupButtonのactionを設定(コード内のメソッドへ接続)すれば、ボタンをクリック後にそのメソッドがコールされる。

なお、参考ページではdelegateに接続してるけど、

部品構成(storyboardの場合)

↑ファイル構成はこんな感じなのでViewControllerクラスに接続してる。




※1 苦し紛れの回避策
NSPopupButtonオブジェクトのsuperviewはセルを示すのであらかじめ
-(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row;
で各行のセルのポインタを得ておけばなんとかわかるのだが、、、そんなの強引すぎるよな。素直にバインドを勉強しようと思いました。


※2 Libraryとは
Storyboardで部品を選ぶ方法


※3 参考リンク
NSTableViewをCocoa Bindingsで使ってみた - takopomm’s diary


※4 Connections inspectorとは
Connections inspector
↑右から3つ目、丸の中に右矢印のあるやつ。


※5 Bindings inspectorとは
Bindings inspector
↑右から2つ目、ラーメン鉢の模様みたいなやつ。





<< Automatorとショートカットを使い文字数を数える  TopPage  Amazonプライムビデオで見たアニメ >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1216-6f3b3f60




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad