2011年10月28日金曜日

アンドゥの実装について


 今はRootViewControllerでアンドゥの実装を検討している。
 開発中のソフトは「iOS開発におけるパターンによるオートマティズム」を参考にして組んでいるのだが、残念ながらアンドゥの実装については触れられていない。そこで以下の方針で組んでみたのだが、うまくいきそうだ。

○アンドゥの有効範囲は一画面以内とする
 その方がわかりやすいのではないかという事と、メモリ節約の為という二つの理由でそうした。これを実現する為に以下の内容を実装した。
・別画面に遷移する時(ナビゲーションコントローラに別のビューコントローラをプッシュする時)にアンドゥスタックをクリアする
・ビューコントローラが独自のアンドゥマネージャを持つ
 ・viewDidLoadでアンドゥマネージャを生成し、アンドゥスタックを監視する通知のオブザーバになる
 ・releaseOutletsでアンドゥマネージャを解放し、アンドゥスタックを監視する通知のオブザーバ登録を解除する(releaseOutletsはdeallocとviewDidUnloadで呼ばれるメソッド)

○ビューコントローラが自分のアンドゥマネージャから通知を受けてアンドゥボタン、リドゥボタンの有効、無効を更新する
・NSUndoManagerCheckpointNotificationを使う

○アンドゥによるテーブルビューの状態変化、ユーザ操作によるテーブルビューの状態変化にはモデルマネージャがデリゲートへ送る通知を利用して対応する
 これによりユーザ操作に対応する処理とアンドゥ、リドゥに対応する処理が共通になるメリットがある。デリゲートへの通知を利用すれば、モデルオブジェクトが追加、削除、入替されたのがアンドゥによるものなのか、ユーザ操作によるものなのかを区別する必要はない。(モデルマネージャはモデルオブジェクトの配列を管理し、モデルオブジェクトはデータを保持する)
 またモデルオブジェクトを追加、削除、入替するメソッドでは、モデルマネージャに追加、削除、入替を依頼するだけの処理となり、アンドゥ、リドゥする時はアンドゥマネージャにアンドゥ、リドゥを依頼するだけと、とてもシンプルになる。

0 件のコメント:

コメントを投稿