2011年4月9日土曜日

アルバム一覧をサムネイル画像で表示したい

-やりたいこと
Picasaアルバムのように、アルバム一覧をサムネイル画像で表示したい

-利用したライブラリ
Three20 1.0.4

Three20 の TTThumbsViewController を使えば、写真一覧をサムネイルで表示→任意の写真をクリック→写真を表示する は、簡単に実装できる。しかし、ここでは、「写真一覧」の前に、Picasaアルバム のようなアルバム一覧のサムネイルを表示したい。

-実装したい処理の手順
--before--
1
写真一覧をサムネイルで表示
2
任意の写真をクリック
3
写真の表示

--after--
1
アルバム一覧をサムネイルで表示

2
選択したアルバムが持つ写真をサムネイルで一覧表示
3
任意の写真をクリック
4
写真の表示

-------------------------------------
-Three20UI.xcodeproj でどんな実装をしているのか確認する

--任意の写真を選択したあとに呼び出されるメソッド
---メソッド名
- (void)thumbsTableViewCell:(TTThumbsTableViewCell*)cell didSelectPhoto:(id)photo;
---定義ファイル名
TTThumbsTableViewCellDelegate.h

--上記の関数を実装しているファイル名
TTThumbsViewController.m

- (void)thumbsTableViewCell:didSelectPhoto: メソッドはデリゲートメソッドなので、自分のメソッド内でこのメソッドをデリゲートすればいいのかなと考えたが、次の処理(写真一覧をサムネイルで表示する)では Three20 に処理を任せるので、superクラス(TTThumbsViewController)の処理も残しておきたい。というわけで、オーバーライドするのが正解。
-------------------------------------
-実装例

MyViewController.m
- (void)picasaWebDataSourceFetchAlbumCompleted:(PhotoSet *)dataSource{

 MyThumbsViewController *thumbs = [[MyThumbsViewController alloc] initForPhotoSource:dataSource 
                withPicasaWebDataSource:self.picasaDataSource];

 [self.navigationController pushViewController:thumbs animated:YES]; // この後、Three20 の処理に移る
}


MyThumbsViewController.m
- (void)thumbsTableViewCell:(TTThumbsTableViewCell*)cell didSelectPhoto:(id)photo {
 // 自分のメソッド内で thumbsTableViewCell:didSelectPhoto: をオーバーライドして処理を Three20 から自分の実装に処理を戻す
 
 NSInteger index = photo.index; // 選択したアルバムのインデックスを取得しておく
 [self.picasaDataSource fetchSelectedAlbum:index]; // Picasa Web Albums Data API の fetch 処理を呼び出す
}

この後、TTThumbsViewController で初期化したオブジェクトを pushViewController: メソッドの引数に設定する。そして、選択したアルバムがもつ写真一覧をサムネイルで表示する処理を Three20 でやってもらう

MyThumbsViewController.m
- (void)picasaWebDataSourceFetchAlbumPhotosCompleted:(PhotoSet *)dataSource{
 TTThumbsViewController *thumbs = [[TTThumbsViewController alloc] init];
 thumbs.photoSource = dataSource;
 
 [self.navigationController pushViewController:thumbs animated:YES];
 
}

2011年3月10日木曜日

インスタンス変数へのアクセス

appleのサンプルで使用される構造体ポインタ演算子( または、アロー演算子: -> )についてのメモ。

プロパティへのアクセス方法
ドット構文を使うと、構造体の要素にアクセスするときと同じパターンを使ってプロパティにアクセスできます。*1

ドット構文は単なる「シンタックスシュガー」であり、コンパイラによってアクセサメソッドの呼び出しに変換されます(そのため実際にはインスタンス変数に直接的にアクセスするわけではありません)。*1

以下のような理解でいいのか?
- プロパティには直接アクセス出来ない。
- しかし、構造体ポインタ演算子(->)を使うと、アクセサメソッドを経由しないで直接インスタンス変数にアクセスすることが出来る。

インスタンス変数がレシーバでないオブジェクトに属する場合は、オブジェクトの型を静的な型定義によってコンパイラに明示しなければなりません。静的に型定義したオブジェクトのインスタンス変数を参照するには、構造体ポインタ演算子(->)を使用します。*2

参照:
*1
objective-c 2.0 プログラミング言語 -> プロパティ -> 概要 -> プロパティへのアクセス
*2
objective-c 2.0 プログラミング言語 -> クラスの定義 -> クラス実装 -> インスタンス変数の有効範囲

2011年2月28日月曜日

ユニットテストフレームワークを使う

OCMock のサイト

プロジェクトへの追加方法
stackoverflow / OCMock for iPhone (iOS4, XCode 3.2.3)

ただし、以下のように文字だけで説明している。
Delete ocmock.framework, the copy file phase, and any search path linking to ocmock header.

check out the latest version from ocmock svn repo : http://svn.mulle-kybernetik.com/OCMock/trunk

ダウンロード元は、svn の他に OCMock のサイト にも .dmg ファイルのダウンロードリンクがある。

Build the OCMockPhoneSim target

1.
ダウンロードしたフォルダ内にある OCMock.xcodeproj を開く。

2.
画像のように概要を設定する。




Copy the libOCMock.a and Headers folder in your project folder
OCMock プロジェクトフォルダ内の、 build -> Release-iphonesimulator フォルダの中身(Headers フォルダとlibOCMock.a)を自分のプロジェクトへコピーする。

add the libOCMock.a to your framework and add a link to the headers folder in your target library search path.
1.
プロジェクトへ追加する。
グループとファイル -> Frameworks を右クリック
Frameworks -> 追加 -> 既存のフレームワーク -> (その他を追加 ボタンを押下) 先ほどビルドした libOCMock.a を追加する。

2.
ヘッダ検索パスと他のリンカフラグを設定する。
グループとファイル -> (新しく追加したテスト)ターゲット -> (Unit Test Bundle)名 -> 情報を見る をクリックする。

3.
ヘッダ検索パスは、Headersフォルダへのパスを設定する。
ex) $(SRCROOT)/OCMock/Headers

リンカフラグ は次を設定する。
-all_load

---------
xcode のセットアップはapple のユニットテストのページ等を参考にするみたい。
Unit Testing Applications

2011年2月24日木曜日

アルバムの一覧をサムネイルで表示する

Contains the URL of a thumbnail of a photo or album cover.

<media:thumbnail> エレメントにあるURLを利用してアルバムを一覧表示できる。

参照:
Picasa Web Albums elements reference -> Media RSS (media namespace) element reference -> media:thumbnail

GDataObject の基本

GDataObject についての説明を picasa の場合で考えてみる。
Servers respond to client GData requests with feeds that include lists of entries.

Each feed and entry is composed of elements. Elements represent either standard Atom XML elements, or custom-defined GData elements.

Feeds, entries, and elements are derived from GDataObject, the base class that implements XML parsing and generation.

おおよそのイメージはこんな感じなのだろうか。



参照:
gdata-objectivec-client -> Wiki -> GDataObjeCIntroduction -> Google Data APIs Basics

2011年2月2日水曜日

オブジェクトの所有権の取得 retain

受け取ったオブジェクトを破棄したくない場合もあります。たとえば、インスタンス変数にオブジェクトをキャッシュする必要がある場合です。
このような場合は、オブジェクトが不要かどうかを知っているのは自分だけであるため使用中にオブジェクトが破棄されないことを保証する機能が必要となります。これは、retainメッセージを使って行います。

 – (void)setMainSprocket:(Sprocket *)newSprocket {
 if (mainSprocket != newSprocket) { // 古いインスタンス変数を確実に解放するための判定を行う
 [mainSprocket release];
 mainSprocket = [newSprocket retain]; // 参照カウンタが1増える
    }
 }

---------------
参照
Cocoaメモリ管理プログラミングガイド オブジェクトの所有権の取得

2011年1月15日土曜日

ファイルを素早く開く(定義、実装にジャンプする)

ファイルを素早く開く(定義、実装にジャンプする)ショートカット
⌘ + shift + d