2007/02/02

リサイズイベントへの反応とコントローラーへのoutletの設定

前回ゴールとしたもののうち、1つ残っていたのがウィンドウのリサイズに応じてNSMatrixのセルの配置を修正することだ。例えば、画像を10枚表示したい時、横に4枚しか並べられないなら4x3で表示するが、このウィンドウの幅がさらに狭くなって横に3枚しか並べられないなら3x4で表示するようにしたい。



ウィンドウのリサイズイベントは、viewDidEndLiveResizeメソッドで拾うことができる。MyMatrixの表示状態が変わるのだから、MyMatrixクラスのviewDidEndLiveResizeメソッドをオーバーライドしてみた。

- (void)viewDidEndLiveResize
{
NSLog(@"viewDidEndLiveResize");
[self maybeJustExpand];
[controller assignImageToCell];
[self sizeToCells];
[self setNeedsDisplay:YES];
[super viewDidEndLiveResize];
}
ここで1つ問題があった。縦横のセルの数が変わる際、それらのセルに対して画像を再設定してあげないといけないのだが、この画像の情報はモデルクラスに持たせてある。そこで、このビュークラスは、コントローラークラスに依頼してその情報を設定してもらうと良さそうだ。

MyMatrixからMyControllerを参照したいので、これはアウトレット(outlet)の出番だ。Interface BuilderでMyMatrixからMyControllerにControl+ドラッグできればいい。次のスクリーンショットみたいに設定したいのだが、これがなかなかうまく行かない。

結局うまく出来なかった。ではどうやるのかというと、nibファイルを見るウィンドウのところの右端にあるリスト表示ボタンを押す。

すると、画面が次のように替わる。今まで謎だったが、アイコン表示ではWindowと表示されていたものは、実は階層構造になっていて、ウィンドウに配置したコントロールにアクセスできる。

ここで、MyMatrixまで辿ったあと、MyMatrixの行をControl+ドラッグし、MyControllerで離すと意図していたoutletの設定が出来た。

これでMyMatrixはメンバ変数controllerでMyControllerのインスタンスにアクセスできるようになった。ここで、(void)MyController:assignImageToCellというメソッドを書いて、モデルとビューをつないでやることで無事リサイズ時の再配置を実装できた。

これで最低限の表示はできるようになった。次は一歩進めてドラッグアンドドロップを実装してみようと思う。ゴールは、ファインダ等外部から画像ファイルをこのウィンドウにドラッグアンドドロップした際、その画像をモデルクラスに追加し、セルに表示することとする。

0 件のコメント: