2011年10月30日日曜日

アンドゥの実装について(修正)


 紋様のパラメータをランダマイズする機能を追加。これに伴い、モデルオブジェクトにアンドゥマネージャをセット、クリアする処理を追加。
 アンドゥの実装を修正。ビューが画面表示されていない時に通知を受けても意味がないので、viewDidAppear:とviewWillDisappear:で通知の登録と解除を行う事にした。
 "Using Undo on iPhone"では編集モードから抜けたら確定して、アンドゥ可能にしなくてよいと書いてあるが、そこまではやっていない。

・別画面に遷移する時(ナビゲーションコントローラに別のビューコントローラをプッシュする時)にアンドゥスタックをクリアする
・ビューコントローラが独自のアンドゥマネージャを持つ
 ・viewDidLoadでアンドゥマネージャを生成し、アンドゥスタックを監視する通知のオブザーバになる
 ・releaseOutletsでアンドゥマネージャを解放し、アンドゥスタックを監視する通知のオブザーバ登録を解除する(releaseOutletsはdeallocとviewDidUnloadで呼ばれるメソッド)
 ・viewDidAppear:でアンドゥスタックを監視する通知のオブザーバになり、モデルオブジェクトとモデルマネージャにアンドゥマネージャをセットする。
 ・viewWillDisappear:でアンドゥスタックを監視する通知のオブザーバ登録を解除し、モデルオブジェクトとモデルマネージャにセットしたアンドゥマネージャをクリアする。アンドゥスタックをクリアする。

2011年10月28日金曜日

アンドゥの実装について


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

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

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

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

2011年10月16日日曜日

メモリ不足で追加ボタンが消える


 原図のサイズを変えようとするとクラッシュするのは、Setterの中でSetterを呼んで無限ループに陥るという単純なミスが原因だった。変数名がアンダーバーから始まるのが嫌だったので修正していたのだが、そこで機械的に置き換えてしまったらしい。そちらは単純ミスだからまあ良いのだが、タイトルの追加ボタンが消える問題には少々手こずった。

現象
 Repeating Motif Generator for iPadはSplit View-based Applicationなのだが、左ペインに紋様リストを表示するテーブルビュー、右ペインに選択された繰返し紋様を表示する。左ペインのナビゲーションバーには追加ボタンがあるのだが、実機テスト中にこれが消える現象が発生した。シミュレータでは「メモリ警告をシミュレート」すると再現する。viewDidUnloadでaddButtonをreleaseしているのだが、viewDidLoadで再ロードされてアウトレットに接続される筈だ。だからボタンが消える筈はない。ところが現実にはそうならない。いくらソースコードを眺めても原因が分からなかったのだが、それも当然で、原因はnibファイルの作り方にあった。

原因
 Split View-based ApplicationのテンプレートにMainWindow.xibがあるのだが、今まではその中にaddButtonを作って入れていた。だがよく考えてみれば、RootViewControllerとMainWindow.xibには何の関連もない。調べてみたがRootViewControllerのnibNameプロパティには何もセットされていないのだ。これではviewDidLoadで追加ボタンが再ロードされて、アウトレットに接続される訳はない。

対策
 そこで対策としてRootView.xibを新たに作成し、そこにaddButtonを移した。RootView.xibのFile's OwnerにはRootViewControllerを指定する。RootView.xibにはTable Viewを作り、File's OwnerのviewアウトレットにそのTable Viewを接続する。MainWindow.xibのRootViewControllerではaddButtonのアウトレット接続を外し、アトリビュートインスペクタでNIB NameをRootViewと指定する。要するにDetailViewと同じ構成にした訳だ。これでソースコードを一切変えずに問題が解決した。
 MainWindow.xibにボタンを作っても最初は動いてしまうというのが落とし穴だ。全く動かなければすぐに気づいたのだが。

2011年10月12日水曜日

どんな風に利用されるのか


継ぎ目なくつながる紋様を簡単に作り出したい、と思って開発したMac用のRepeating Motif Generatorだが、使う人は何に利用しているのだろう?
"Repeating Motif Generator"で検索してみると、ダウンロードサイトは多数見つかるものの、こんな風に使っていますといった事例はあまり見つからない。
ただ少ないとは言ってもウェブサイトの背景に使っている人、イラストの背景に使っている人、マンガのスクリーントーン作成に使えるとコメントした人、フリー素材を作っている人がいた。中にはオリジナルデザインTシャツやグッズの制作に使っている人も。
そういえばデザイン会社の人から、作った紋様の権利についてメールで聞かれた事もあった。もちろん、そんな権利を主張するつもりなど毛頭なく、どうぞご自由にお使いくださいと答えたのだが、結局どんな風に使ったのかは教えてもらえなかった。残念。

作例を見ると、シングルレイヤーで作られているものしか見当たらないのが気になる。マルチレイヤーの方がずっと良いものができると思っているだけに歯痒さを覚える。マルチレイヤーをデフォルトにした方が良いだろうか?

ブログの背景をMac用のRepeating Motif Generatorで作ったものに変えてみた。これはもちろんマルチレイヤーだ。5レイヤー重ねている。

開発を再開

デベロッパプログラムの更新が済んだので、証明書の再発行とプロビジョニングファイルの更新をして、実機にアプリを転送した。原図のサイズを変えようとするとクラッシュするが、昨日はここまで。

2011年10月10日月曜日

ライセンス・リニュード

来週でiOSデベロッパプログラムの期限が切れるので、少し悩んだが更新した。8,400円は安くはないが、そもそもiPadでRepeating Motif Generatorを動かしてみたくてiPadを買ったのだから、あきらめるにはまだ早い。機能は少ないながら、動くものはできているわけだし。
とは言え、ここ4ヶ月程は全くの手つかずであるのも事実で、プログラミングから遠ざかる事久しく、中身もすっかり忘れてしまった。再開にあたって、きっかけというかモチベーションを維持する仕掛けが何か欲しいところだ。
そんなわけで、このブログを始める事にした。これを自分へのプレッシャーにしようという訳だ。コメントなどいただけると、少しはやる気が出るかもしれない。

Mac用のRepeating Motif GeneratorはVersion 1.0を2006/12/2に公開している。最終バージョンはVer.3.0.5で、2008/1/27の公開。OS10.3.9での動作を確認している。Panther → Tiger → Laopard → Snow Leopardときて次がLionだが、こんなにOSが代替わりしても動くのだろうか?
恐る恐るOS 10.7.1で確認したが、特に問題もなく起動し、昔のファイルも読み込め、新しい紋様を作る事もできた。致命的な問題はなさそうでホッとした。