FC2ブログ

頭と尻尾はくれてやる!

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


macOSでテーブル処理をViewController以外に記述したい

iOSアプリ開発の調子でmacOSアプリに取り組んで泣きを見てる。UIをNSに変えればいいんだろうと思ってた過去の自分に説教したい。

今回はテーブルを表示しようとしたんだが、基本的なことはまあ何とかなった。

macOS NSTableView Tutorial

↑またこちらのサイトにお世話になった。ありがたいことです。

ただstoryboard上にNSTableViewを乗っけた場合、そこからのdelegateやdataSource、クリックを拾うactionはViewControllerにしか繋げられなくて困った。
関連の処理はViewControllerクラスじゃなくて別なHogeManagerクラスに記述したいんだあ、、、なんて時ってあるよね?惰性でやるとViewControllerはどんどん巨大化していくのよ。

ファイル構成図

↑ちなみにHogeMangerはViewControllerクラス内から参照できる。
こういう場合、どうすればいいんだろう???
{
    //ViewConteroller.h

    IBOutlet NSTableView *myTableView;
}

{
    //ViewConteroller.m

    hogeManager = [HogeManager new];
    myTableView.delegate = (id<NSTableViewDelegate>)hogeManager;
    myTableView.dataSource = hogeManager;
}
↑storyboardの扱いが未熟な俺は仕方なくNSTableViewオブジェクトの参照をViewControllerクラスに接続。
コードでdelegateとdataSourceをセットした。ああ、原始的。なんかstoryboard使うやり方ありそうな気がするんだけどなあ?

なおdelegateの設定のところで
Assigning to 'id<NSTableViewDelegate> _Nullable' from incompatible type ‘HogeManager *__strong'
というワーニングが出てたので上のようにキャストしたら消えた。

テーブルを使う時はたいていセルを選択した時の処理を記述したいよね。
storyboardからViewControllerにactionをつないでもいいけどそうするとViewController内で受けたIBActionをHogeManagerに「あいよ!」って渡す処理が必要になる。そりゃ短いけどなんか嫌じゃない?
結局セルのクリックはdelegateでも検出できるらしいのでそっちで拾うことにした。
ただiOSの
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
と言ったわかりやすいのはないようで、、、

NSTableViewで行選択をしたときに呼ばれるデリゲートメソッド: 永遠ログ

↑こちらを参考にさせて頂きました。感謝!

<< macOSでwindowを閉じる時に「保存しないの?」って聞いて欲しい  TopPage  iOSで出力したファイルをAirDropでMacに送信する >>

コメント


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

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1102-bdc8c9a0




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

FC2Ad