2009年8月21日金曜日

"Window-based Application" から組み立ててみる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
一行メモの開発に入る。

新規プロジェクトを作成し "Window-based Applicatoin" を選択する。
名前を "OneLiner" とした。

この直後はデフォルトで用意されるアプリケーションデリゲートのクラスが1つできるだけ。
まずはビューを1つ追加してみよう。

新規ファイル作成を選び "UIViewController subclass"を選択する。
名前は "MainViewController" とする。
作成時のオプションで "With XIB for user interface" を入れておく。こうすると自動的にクラスの同名の XIBファイルを作り File's owner をそのクラスにしておいてくれる。

こんな感じ。



これらをつなげる作業に入ろう。
最終イメージはこう。



まずコードにプロパティとアウトレットを追加する。

OneLinerAppDelegate.h
@class MainViewController;
@interface OneLinerAppDelegate : NSObject {
UIWindow *window;
MainViewController* mainViewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet MainViewController* mainViewController;

@end


mainViewController が新規に加わった部分。


続いて MainWindow.XIB を開きアウトレットを接続する。

(1) MainWindow.XIB に UIViewController を追加し、クラスを MainViewController に変える
(2) OneLinerAppDelegate のアウトレット mainViewerController に(1)を接続する

さらに MainViewController.XIB を開きとりあえず簡単なコントロールを配置しておく。


最後にプログラムで window と ビューを接続する。
OneLinerAppDelegate.m
- (void)applicationDidFinishLaunching:(UIApplication *)application {    

// Override point for customization after application launch
[window addSubview:mainViewController.view];
[window makeKeyAndVisible];
}



さて実行してみよう。
ビューが表示された。




- - - -
これら一連の操作は実は Xcodeで新規プロジェクトを作成する時に "View-based Application" を選ぶと自動的に行われるもの。今回手動でやってみることでそれぞれの関係を理解することができた。

2009年8月20日木曜日

習作アプリ作成開始〜「一行メモ」

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
いくつかサンプルを読んで雰囲気がわかってきたので、習作アプリを1本作ってみる。

あまりあれこれ欲張っても時間がかかるだけなので、画面も少なく極力シンプルなものを手がけてみよう。

それが「一行メモ」。1行のメモを記録するだけのアプリ。一応写真が取れるようにしておく。


データは SQLite へ格納する。

2009年8月19日水曜日

iPhoneシミュレーターで日本語を入力する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
最初は英数字しか入力できず日本語をどうやったら入力できるのかがわからなかった。
分かってみれば簡単。

1. iPhoneシミュレーターを立ち上げる
2. シミュレーター内の「設定」をクリック
3. 「一般」>「言語環境」と開き「言語」で日本語を選ぶ

ついでに「書式」を日本に変えておく。

- - - -
なるほどこのあたりも実機と同じ様につくってあるのか。
英語環境でのテストも簡単にできそうだ。

2009年8月18日火曜日

本情報:Core Data for iPhone

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
iPhone関連の洋書の紹介。

「Core Data for iPhone: Building Data-Driven Applications for the iPhone and iPod Touch (Core Frameworks Series) (ペーパーバック)」



表題からして 3.0からサポートされた Core Data を使った開発の解説のようだ。

2009年8月17日月曜日

「第16章 iPhoneのカメラとフォトライブラリ」のサンプルを走らせる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク


ソースコードを読む。

CameraViewController.h
@interface CameraViewController : UIViewController 
{
:
@property (nonatomic, retain) IBOutlet UIImageView *imageView;
@property (nonatomic, retain) IBOutlet UIButton *takePictureButton;
@property (nonatomic, retain) IBOutlet UIButton *selectFromCameraRollButton;
- (IBAction)getCameraPicture:(id)sender;
- (IBAction)selectExistingPicture;
@end


2つのデリゲートの実装を宣言している。またビューと2つのボタンのアウトレット、そしてボタンをタップしたときのアクションが2つある。


CameraViewController.h

初期化処理。カメラが無い場合(iPod Touch)はボタンを隠すようにしている。
- (void)viewDidLoad {
if (![UIImagePickerController isSourceTypeAvailable:
UIImagePickerControllerSourceTypeCamera]) {
takePictureButton.hidden = YES;
:
}
}



"Take New Picture" もしくは "Pick from Camera Roll" を押したときの処理。
- (IBAction)getCameraPicture:(id)sender {
UIImagePickerController *picker =
[[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsImageEditing = YES;
picker.sourceType = (sender == takePictureButton) ?
UIImagePickerControllerSourceTypeCamera :
UIImagePickerControllerSourceTypeSavedPhotosAlbum;
[self presentModalViewController:picker animated:YES];
[picker release];

}


UIImagePickerController のインスタンスを作り、デリゲート等プロパティを設定する。
押されたボタンの種類によってソースをカメラもしくはフォトアルバムのいずれかに切り替えている。
そして最後に presentModalViewController:animated: へ UIImagePickerController を渡す。
なるほど。これによって、例えば "Take New Picture" を押した場合、カメラのビューが下からずずずっとスライドしてくる動作になるのか。

ADCリファレンスを見るとモーダルビューへのアニメーションの種類を modalTransitionStyle で制御できるらしい。
試しに UIImagePickerController の modalTransitionStyle を UIModalTransitionStyleFlipHorizontal に設定してみた。
picker.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;


すると今度は水平方向にパネルが回転するようなアニメーションでカメラのビューに切り替わった。

カメラでの撮影、もしくはフォトアルバムからの選択が終わるとデリゲートメソッドが呼ばれる。
- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingImage:(UIImage *)image
editingInfo:(NSDictionary *)editingInfo {
imageView.image = image;
[picker dismissModalViewControllerAnimated:YES];

}

画像が UIImage として渡されるのでこれを表示用ビューへ設定する。最後に dismissModalViewControllerAnimated: でカメラのビューを消す。

キャンセル時にもデリゲートメソッドが呼ばれるのでカメラビューをキャンセル。
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

[picker dismissModalViewControllerAnimated:YES];
}



参考本:はじめてのiPhoneプログラミング

2009年8月16日日曜日

オーガナイザ「開発をサポートできませんでした」

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ある日突然、オーガナイザから「開発をサポートできませんでした。」と表示される。

なんだこれ、と思いつつネットで調べると同様の現象は結構出ているようだ。解決策の中には OS を 3.1β に上げれば直るなんて載っていた。β版へのバージョンアップか。。今はやりたくないな。もう少し調べると iPhoneの電源の入れ直しで直ったとのブログがあった。

iPhone実機でデバッグ出来ない!


試して見るとうまくいった。ふう。


2009年8月15日土曜日

「第11章データの保存」のSQLiteサンプルを走らせる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
入手したサンプルコードをビルド(フォルダ: 11 Persistence SQLite) 。

iPhoneシミュレータで動作を確認。入力した文字列が次回起動時にも反映されている。



ソースコードをざっと確認する。
PersistenceViewController

まず起動時に viewDidLoad が呼出される。
- (void)viewDidLoad
 ・SQLite DB にテーブルを作成 (CREATE TABLE)
 ・保存してあった文字列を取得(SELECT)し、UITextFieldへ設定
 ・UIApplicationWillTerminateNotification を登録


DBから取得した文字列を UITextFieldへ設定するのに KVCを使っている。
            NSString *fieldName = [[NSString alloc]
initWithFormat:@"field%d", row];
NSString *fieldValue = [[NSString alloc]
initWithUTF8String:rowData];
UITextField *field = [self valueForKey:fieldName];


fieldNameは "field1", "field2" , ...となりプロパティ名と一致する。これを使い valueForKey で UITextFieldのインスタンスを取得している。


終了時。
- (void)applicationWillTerminate:(NSNotification *)notification
 ・INSER OR REPACE 文を使い文字列を DBへ格納
 ・DBをCLOSE


後始末
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.field1 = nil;
self.field2 = nil;
self.field3 = nil;
self.field4 = nil;
[super viewDidUnload];
}




SQLite ファイルはどこに書き出されているのか。デバッガコンソールへ出力してみる。
- (NSString *)dataFilePath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(@"%@", documentsDirectory); // デバッガコンソールへディレクトリを表示
return [documentsDirectory stringByAppendingPathComponent:kFilename];
}


結果。
2009-08-15 06:16:30.345 Persistence[1509:20b] /Users/hashi/Library/Application Support/iPhone Simulator/User/Applications/C5128B12-58D5-4873-A224-781256D016BA/Documents




なるほど。



気がついた点が1つ。IBOutlet は @property でも記述できるのか。
@interface PersistenceViewController : UIViewController {
UITextField *field1;
:
}
@property (nonatomic, retain) IBOutlet UITextField *field1;



参考本:はじめてのiPhoneプログラミング

2009年8月14日金曜日

「はじめてのiPhoneプログラミング」のサンプルコードを探す

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
本に載っているサンプルコードを試しながら iPhoneプログラミングを学習したいのだが、いかんせんソースを打ちこむ時間がなかなか取れないし、その時間が惜しい。ソースを読むだけでも学習になるのだが、やはり実際に動かして自分なりの修正を加えて動作の確認を取りたい。

そんなわけで本で紹介されているホームページを開いてサンプルコードが無いか探してみた。

Dave and Jeff’s Excellent iPhone Support Page



既にiPhne 3 版が出ている。。

サポート用の掲示板もあるようだ。



目的のソースコードはトップページにリンクがあった。

http://iphonedevbook.com/BegiPhone3_Aug_2_2009.zip

解凍すると本の章ごとにフォルダが分けてある。これだな。


ただ iPhone OS 3 用のもののようだ(日本語は iPhone OS 2)。まあいい。

2009年8月12日水曜日

UITableView のサンプルを試す

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
本の「第8章 テーブルビューの導入」(P.204)を読み、最初のサンプルを走らせてみた。



データソースを使うところは NSTableView と良く似ている。

2009年8月5日水曜日

実機でアプリを動かす

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
iPhone Developer Program へ参加できたので、実機でアプリ(HelloWorld)を動かしてみる。下記の記事が参考になった。

目指せ!iPhoneアプリ開発エキスパート
第9回 デバイスでアプリを動かす


iPhone Developer Program Portal には(英語だが)ウィザードのようなものも用意されていたのでそれを使ってみた。いくつかのステップを指示に従って進めていくだけで最終的に Provisioning Profile が作成できる。私の場合は作成途中で10分以上待たされた上にエラーとなってしまった。ただログインしなおして見に行くと Profileが作成されていた。

Provisioning Profile は 3つの情報を1つにまとめたものとなる。
1. Development certificates ... 証明書
2. Device identifiers ... 実機を識別するID
3. App ID ... アプリを識別するID


1. は MacOSXで CSR (Certificate Signing Request) を作り、Developer Program Portal で署名してもらう(その結果証明書ができる)。

それぞれの情報は複数つくることができて、Provisioning Profile はそれらを束ねたファイルとなる。つまり証明書、DeviceID、AppIDをいろいろ組み合わせた Profileを作ることができる。これが実機ビルド/インストールに必要となる。
(このあたりは iPhone Reference Library > iPhone Development Guide > Managing Devices に説明があり図もあってわかりやすい)

なお先日 iPhoneOS 3.0.1 がリリースされ、そのままでは Xcodeで開発ができないらしい。その件については下記情報が参考になった。
iPhone OS 3.0.1への実機ビルド対応について


さて手順通り進めるとなんとか実機で(適当に作ったサンプルの)アプリを動かす事ができた。


- - - -
ようやくスタート地点に立てた。