2009年9月2日水曜日

CoreDataを使う

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
iPhone3.0から CoreData が使えるとのことだったので OneLiner で使ってみることにする。CoreDataは随分昔に MacOSXで使ったことがあるのでそのときの記事を引っ張りだしてきてコードを書いてみた。

Cocoaの日々(旧)
Core Data その1

CoreDataは永続性スタックと呼ばれるいくつかのクラスで構成されていて、利用時にはこれらのインスタンスを用意する必要がある。

(過去記事から引用)


コードはこんな感じ(とりあえず awakeFromNib に書いてみた)。
- (void)awakeFromNib
{
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:[NSManagedObjectModel mergedModelFromBundles:nil]];

managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator:persistentStoreCoordinator];

NSError* error = nil;
NSString* filepath = [NSString stringWithFormat:@"%@/%@",
[NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0],
@"memo.db"];

[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:[NSURL fileURLWithPath:filepath]
options:nil
error:&error];
NSLog(@"1:%@", error);

NSManagedObject* memo =
[NSEntityDescription insertNewObjectForEntityForName:@"Memo"
inManagedObjectContext:managedObjectContext];
[memo setValue:@"hello" forKey:@"title"];
[memo setValue:@"photo1.png" forKey:@"photo"];
[managedObjectContext save:&error];
NSLog(@"2:%@", error);
}


永続性スタックである NSPersistentStoreCoordinator, NSManagedObjectContext を用意し、必要な処理を加えていけば良い。以前の記事でも解説されているが、前者はモデル(いわゆるスキーマ)と(persistent object storeを通じて)DBファイルを扱い、後者はDBに対する検索、追加、変更、削除などのプログラミングのインターフェイスを提供している。今回永続化タイプは SQLite を選んだ。

モデルは Xcodeの「新規ファイル...」から作成できる。


今回は Memo というエンティティを1つ用意した。


さて実行してみよう。所定の場所に memo.db が作成されて(サンプルコードで挿入した)値が格納されているのがわかる。

2009年9月1日火曜日

Snow Leopard 付属の Xcode3.2 アップグレードすると iPhone開発ができなくなった

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Snow Leopard 付属の Xcode3.2 アップグレードすると iPhone開発ができなくなった。iPhoneを接続してもオーガナイザになにも表示されない。

ネットを調べると Snow Leopard用の iPhone SDK が出ているとこのことだった。

iPhone Dev Center(要ログイン) へログインし、Downloadsから "iPhone SDK (Snow Leopard)" を選びダウンロードしインストールする。

すると iPhoneが認識され、無事にビルドすることができた。

- - - -

XCode3.2 ではフォントが変わった。

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プログラミング