2008年11月22日土曜日

CS193P Cocoa Programming - 6日目、NSUserDefaultsの使い方

  • アプリケーションが終了した後もデータを保持したい(例:現在開いているページなど)
  • NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  • あとはNSDictionaryとほとんど同じ(格納の仕方も取得の仕方も)
  • BOOLとかintをそのまま格納できるメソッドもあります
  • 格納するタイミングは、値がかわった瞬間かまたはアプリが終了する瞬間
  • 取得するタイミングは、アプリが立ち上がった瞬間かまたはawakeFromNibメソッド
今日はNSUserDefaultsとやらの使い方を学習。
NSUserDefaultsとはアプリケーションが終了した後もデータを保持することができる仕組みのようです。
本格的にデータを保存したいならSQLiteやファイルを使うんでしょうが、ちょっとしたデータ(例えば現在開いているページ)を保持したいときなどにSQLを書くのは煩雑です。そういうときに便利に使える仕組みらしいです。

○値を格納する
タイミングは二つ。値がかわった瞬間か・・・
//ボタン押し下げ時に値を減らす
- (IBAction)decrease {
int currentNum = polygonShape.numberOfSides;
currentNum--;
polygonShape.numberOfSides = currentNum;
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:currentNum forKey:@"numberOfSides"];
[self updateInterface];
}
またはアプリケーションが終了するタイミングか。
//@implementation HelloPolyAppDelegate(アプリケーションのデリゲートの中で)
- (void)applicationWillTerminate:(UIApplication *)application {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:controller.model.intValue forKey:@"numberOfSides"];
}
パフォーマンスに応じてどちらか好きな方を選んでくださいとのことです。

○値を取得する
こちらもタイミングは二つ。アプリケーションが立ち上がったタイミングか・・・
//@implementation HelloPolyAppDelegate(アプリケーションのデリゲートの中で)
- (void)applicationDidFinishLaunching:(UIApplication *)application {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
int storedNumberOfSides = [defaults integerForKey:@"numberOfSides"];
controller.model.intValue = storedNumberOfSides;
[window makeKeyAndVisible];
}

または対象のクラスのawakeFromNibメソッドの中か。
//ここではコントローラクラスの中で・・・
- (void)awakeFromNib {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
int storedNumberOfSides = [defaults integerForKey:@"numberOfSides"];
self.model.intValue = storedNumberOfSides;
[self updateInterface];
}

この二つの違いは正直わかってません。複数のNibファイルを利用するときはawakeFromNibでないと駄目らしいですが・・・

CS193P Cocoa Programming - 5日目、いよいよView自作

  • Interface Builderを使ったらとにかくWrite Class Files...を押すのを忘れないように
  • 描画はJavaのSwingなどとほぼ同じ
  • drawRectメソッドをオーバーライドして描画する
ViewとかAnimationとか、いよいよ実践が近くなってきたようです。
だんだんと難易度も上がってきました。



まずは自作Viewを作成。
Interface BuilderからUIViewを引っ張ってきて画面上に配置。
クラス名を適当に(ここではPolygonView)に変更。
ControllerクラスやらModelクラスなど、必要に応じてOutletを追加します。
最後に(一番忘れやすいんだけれども)メニューからFile > Write Class Files... この書き出しを行わないとXcode上に実際のソースが出てきません。

書き出しを行ったらXcodeを開いて、以下の2つの仕事を行います。
・先ほど追加したPolygonViewのスーパークラスを定義する
・ControllerにIBOutlet PolygonView *polygonViewを追加する

新しいオブジェクトはWrite Class Filesで一発だと思うけれども、既存のクラス(例えば前回実装したController)なんかは、書き出ししちゃうと上書きしてしまいそう。怖いので今回はXcodeから書くことにしました。でもこれ非常に非効率的。hファイルだけ上書きしてほしいんですけど・・・



勇気を振り絞って上書きWrite Class Files...にチャレンジしたら、なんだかこんなFileMergeとかいうアプリが立ち上がって、きれいにマージすることができましたとさ。よかったよかった。


では早速Viewに描画処理を追加します。
描画を行うのはUIViewの-(void)drawRect:(CGRect)rectメソッドですので、こいつをオーバーライド。
あとは再描画したいタイミングでUIViewのsetNeedsDisplayをコールすれば適切なタイミングでシステムが再描画してくれるというしくみ。Swingに似てますね。



実際に描画してみました。簡単簡単!!



描画のやり方さえわかってしまえばこっちのものです。
ポリゴンの点の位置を計算するメソッドは例題の中で用意されていたので、それを丸コピーして点の位置に線を引くだけ。線の太さを調節する関数はCGContextSetLineWidthというのが見つかったのでそれを使うだけ。リファレンスが使いやすい!すてき!



カスタムビューの中にUILabelを追加して、ラベルにポリゴンの名称を表示できるようにしてみました。UILabel.textプロパティを書き換えるタイミングはカスタムビューのdrawRectの中で。ほかに良いタイミングが見当たらず。


ひとまずこんなところですかね。次は・・・
  • スライダーで線の太さを変える
  • 線の種類を何らかのスイッチで変える
  • ビューの上でフリックしたらポリゴンがくるくる回るようにする(アニメーション処理の勉強が必要)
これらを試してみたいですね。

iPhone OS 2.2にアップグレードに失敗、ずいぶんと酷い目にあいました

  • iPhone OS 2.2へのアップグレード時に途中でエラーが出て中断、そのままインストールが再開できず
  • ケーブルを接続し直したり再起動したりHomeボタン押しっぱなしでセーフモード起動してもiTunesが認識せず
  • 結局Macbook Airにつないでみたら一発でリカバリモードで認識してくれたので助かった
  • ということでiPhoneで本当に困ったときはMacにつなげ、Windowsは信用ならない
  • いつのまにやらiPhone上のi.softbank.jpメールアドレスの設定が非常に簡単になっている(メアドとパスを入れるだけですべてやってくれる)

iPhone OS 2.2が事前予想通りにリリースされたので、さっそくアップデートを試みました。
が・・・途中で原因不明のエラーが出てアップグレードに失敗してしまいました。
そのままiTunesが何度やってもiPhoneを認識しないと言う事態に陥り、あわや愛しのiPhoneが6万円の格好いい板になりはてるかと気が気ではありませんでした。
結局Macにつないでみると無事認識してくれたので、そのままiTunesから復元を試みて無事復活。やれやれです。
基本設定が全部吹っ飛んでしまいましたが、アプリのデータなどはすべてWebサービス上にあるため全く無傷でした。おかげさまでiPhoneが無事立ち上がってからは1時間もかからずにすべてのデータを復元できました。クラウドコンピューティングの強力さを改めて実感です。


メールアカウントを設定し直す際に気づいたのですが、いつのまにかi.softbank.jpメールアドレスの設定が極めて簡単になっています。
以前は設定時にSSL通信を使わないようにしたり、IMAPとSMTPサーバー名を自分で設定する必要があったのですが、今日試してみたらメールアドレスとパスワードを入れるだけで全部自動でやってくれました。

それからiPhone 2.2といえばなんと言っても顔文字。コレで日本語キーボードがQWERTY、10キー、そして顔文字と3つになってしまいました。どれだけ日本語入力に力を入れてるんだって感じです。


メールの設定が楽になったり、顔文字が使えたりワンセグを見れるようにしたりと精力的に対応してくださって本当に助かるのですが、
それでもやっぱり、アップデートを行っただけで二度と起動しなくなってMacにつながない限り復元できなくなるようでは、とてもじゃないですが普通の人にiPhoneをお勧めは出来ないですね-。
だってこんなのが100万台も日本で売れたら、きっとソフトバンクモバイルのカスタマーサポートの中の人がストレスと過労でみんな死んでしまいますよ?