iPhone SDKはいつもベータ

iPhone SDK 3.2の正式版がリリースされてようやくXcodeを二つもインストールしないで済むと思ったら、iPhone OS 4 Betaが出てしまったので、やっぱり複数のXcodeをインストールするはめになりました。

いつかは統合されるんだろうけど、iPad向けにiPhone OS 4が提供されるのは秋になるそうなので、夏にiPhone OS 4がリリースされてもまたしばらくベータの期間が続くのですねー。そしてまた来年新しいSDKが出て…。なかなか落ち着けないな。

というわけで、iPhone SDK 3.1.3はインストーラをバックアップしてDeveloperディレクトリを削除してiPhone SDK 3.2をDeveloperディレクトリに昇格させました。

SIMなしiPhone 3G

結局奥さんが使うというのでiPhone OS 2.2.1でまるっとするっと復元して渡しました。

時々実機テストに貸してくれと思って2.2.1のままにしたんですが、「iTunesとシンクしたらなんか聞いて来たからOKしたらこんなんなっちゃった♪」と言って渡されたのがアクティベーション要求画面。
うお。
もしかして。
iPhone OS 3.0?

そんなこんなで僕も2.xとは決別しようと思います。これからは3.0スタイルでコードを書くようにします。新しいアプリをリリースする事になったらそれはOS 3.0以上が要求される事になるでしょう。マニフェストに書いておこうっと。

キーボードの表示のタイミング

テキストフィールドを持つページへの遷移があって、そのタイミングでキーボードも表示しようとすると、うまいことやらないとページ遷移自体も遅くなるし、なんだかよろしくない。

最初、viewWillAppearでbecomeFirstResponderを呼んでたんだけれど、これだと上記のようにキーボードの表示処理が終わるまでビューが表示されない。

- (void)viewWillAppear:(BOOL)animated {
	[super viewWillAppear:animated];
	[textField becomeFirstResponder];
}

で、viewDidAppearに変更してみた。これだと、テキストフィールドを含むビューに遷移してからどっこいしょという感じでキーボードが表示される。二段階になっちゃったけれど、最初に比べたらなんぼかまし。

- (void)viewDidAppear:(BOOL)animated {
	[super viewDidAppear:animated];
	[textField becomeFirstResponder];
}

キーボードのリソースの先読みみたいなのってないのかなー。

UITableViewをメニュー代わりにしてみる

ViewをLandscapeにすると、UITableViewが横に長くてなんだかもったいないなぁとか思っちゃう今日この頃ですがいかがおすごしですか?

Interface Builderをいじってて、UITableViewの幅を短くしてアニメーションと組み合わせればメニューのように使えるなぁと思ってちょろっとコード書いてみた。

絵的には以下のようになったんだけど、こういう使い方はありなのかしら。
たまには冒険するのもいいか。な。
な、な、な。

TableMenu

コード自体は大した事してないけど、UIViewの中にUITableViewを追加して、親のUIViewのポジションをUIViewのアニメーションでにゅるっと変化させる事で結構メニューっぽく見えるようになった。

- (IBAction)clickCloseMenuButton {
	CGRect frame = menuView.frame;
	frame.origin.x = -1.0 * frame.size.width;
	[UIView beginAnimations:nil context:nil];
	[UIView setAnimationDuration:0.3];
	menuView.frame = frame;
	[UIView commitAnimations];
}
 
- (IBAction)clickShowMenuButton {
	CGRect frame = menuView.frame;
	frame.origin.x = 0.0;
	[UIView beginAnimations:nil context:nil];
	[UIView setAnimationDuration:0.3];
	menuView.frame = frame;
	[UIView commitAnimations];
}

UITableViewの編集後の更新

編集可能なテーブルがあって、編集操作を行って元のテーブルに戻る時、編集結果の反映とテーブルの選択状態の解除の順番がちょっと違うだけでも表示結果が微妙におかしくなる事に気がついた。

編集して帰ってくるだけなので、単純にUITableViewControllerのviewWillAppearで編集結果を反映させる処理を実行させているのだけれど、reloadDataを追加するだけだと選択状態の解除のアニメーションがまるっとなくなる。巷で聞いた話だと、テーブルの行の永続的な選択状態とかフィードバックが無いというのはNGらしく、この辺りの挙動がガイドラインに沿っていないという理由でリジェクトを食らったという事例もあるらしい。

これはダメな例。

- (void)viewWillAppear:(BOOL)animated {
	[self.tableView reloadData];
	[super viewWillAppear:animated];
}

選択状態を解除するのは[super viewWillAppear:animated];のお仕事なので、こいつを遅延して実行させるようにしてみた。

- (void)viewWillAppear:(BOOL)animated {
	if (self.tableView.isEditing) {
		[self.tableView reloadData];
		[self performSelector:@selector(refreshTable) 
			withObject:nil afterDelay:0.2];
	} else {
		[super viewWillAppear:animated];
	}
}
 
- (void)refreshTable {
	[super viewWillAppear:YES];
}

ちなみに、Safariのブックマークの編集は選択状態解除のアニメーションが実行されないけど、どうなんでしょうね。