Day: May 11, 2015

Swift:NSViewControllerとNSTableView?

思いきり開発中のアプリをstoryboard対応に変更したところ、全くダメなことがわかり、再びサンプルプログラムに戻って調査しています。

追記(5/15/2015):先のサンプルコードをベースにすると問題があります。2nd viewのクラスを抜けてしまった後、表示されているEXIFの項目をクリックしてIBActionで編集処理を行おうとしたのですが、main viewのクラスも2nd viewのクラスも変数が初期化され残っていませんでした。後程、正しく動作するものをアップします。

現時点までの問題の整理。Second windowへの表示はまだですが、まあ、これができればこのイッシューは完了となるのですが、サムネールまでのmain windowへの表示はOKになりました。

追記:ふたつ目のwindowへの表示が不完全ですができるようになりました。現時点でわかったことは次の通り。

OK 引数の受け渡しはrepresentedObjectでやればうまくいく。
NG 直接ふたつ目のwindowのメソッドの呼び出し・実行をやっても、画面が遷移しない。これは何かできるはずなので、とりあえずは機能実装してから調べることにする。
NG ふたつ目のwindowのメソッドからひとつ目のメソッドの変数を直接参照するのはできない。コンパイルエラーにはならないが、意図通りの結果にならない。

スクリーンショット 2015-05-11 14.10.46

  • 元々File inspectorのuse auto layoutをoffにしている場合、Size inspectorで調整したオブジェクトをstoryboardにcopy and pasteしたとき、警告エラーが出ます。当然といえば当然ですが、あわてないでuse auto layoutをoffにする必要があります。

File inspectorのuse auto layoutをoffにする。

  • classの定義でNSViewControllerとNSTableViewを同時に指定するとダメです。

NSTableViewの代わりにNSViewControllerを使えばコンパイルエラーはなくなり、viewDidLoadのoverrideエラーも出ません。このやり方でいいようです。

class mesaEditPhoto: NSViewController, NSApplicationDelegate, NSTableViewDataSource, NSTableViewDelegate

  • サンプルプログラムのmain windowのaMessageはReferencing Outletsでmain windowと接続しなければならないことが判明しました。変数は次のように変更して分析中。window間のaMessageの使い分け(分離)はできた気がします。Referencing Outletsでmain windowと接続しないでOutletsから直接接続するとエラーになります。

aMessage ➡️ mesaGPSMessageに変更
—> Referencing Outletsでmain windowと接続

main window ➡️ mesaGPS windowに変更
second window ➡️ mesaEditPhotoに変更

second windowのaMessage ➡️ zMessageに変更
—> Referencing OutletsでmesaEditPhoto windowと接続

  • Unable to load nib file: MainMenu, exitingエラーの発生。関係しそうなことは、上記aMessageの箇所、second windowのObjectのクラスをmesaEditPhotoにしているところでこの2つがサンプルプログラムと異なる。

最初からやり直して問題解消。やれやれ。