ついにMOSADeNがウェブで提供され、画像や図版が追加できるようになりました。「百聞は一見にしかず」解説にも大いに役立ちます。また、今回から開発用ツールを、Snow Leoprdに付属しているXcode 3.2に切り替える事にします。
前回は、画像ファイルを保存する処理を解説しました。今回は、テーブルビューに表示されている行をタップすることで、ファイルからJPEG画像を呼び出し、別のビューコントローラに切り替えて表示する処理を解説します。

まずは、RootViewControllerにtableView:didSelectRowAtIndexPath:デリゲートを実装します。テーブルビューがタップされると、タップされたテーブルビューのセクション番号(今回はゼロ固定)と行番号(ゼロから始まる)が、indexPath(NSIndexPath)で渡されます。このうち、行番号の方はindexPath.rowで得られます。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Model *model;
UIImage *image;
SymmetryAppDelegate *app;
[tableView deselectRowAtIndexPath:indexPath animated:YES];
// テーブルビューのセレクションを外す
if( model=[rt_array objectAtIndex:indexPath.row] )// モデル選択
{
if( image=[model loadImage] ) // 画像の読み込み
{
app=(SymmetryAppDelegate *)[[UIApplication sharedApplication] delegate]; // アプリケーションデリゲート
[app openImageViewControllerWithImage:image]; // イメージビューをオープン
}
}
}
行のセレクション(青色選択表示)を消した後、配列から対象となるモデルを得ます。続いてModelクラスに実装したloadImageメソッドでファイル保存されているJPEG画像をUIImageとして読み込みます。以下が、画像ファイルの読み込みに利用するloadImageメソッドです。前回解説したsaveImageメソッドと逆の処理となります。
- (UIImage *)loadImage
{
NSString *str,*name,*path;
UIImage *image;
str=[NSString stringWithFormat:@"%@-%d",md_name,md_id];
name=[str stringByAppendingString:@".jpg"]; // 拡張子を追加
path=getDocumentPath( name ); // ファイルのフルパス名を得る
image=[[UIImage alloc] initWithContentsOfFile:path]; // ファイル読み込み
return image;
}
処理の最後には、読み込んだUIImageをopenImageViewControllerWithImage:メソッドに渡しています。このメソッドはSymmetryAppDelegateクラスに実装されており、画像を表示するためのImageViewControllerをNibファイルから呼び出し、カールアップ・アニメーションを使い表示します。
(void)openImageViewControllerWithImage:(UIImage *)image // イメージビュー表示
{
if( ! ap_imagevctr )
ap_imagevctr=[[ImageViewController alloc]initWithNibName:@"ImageViewController" bundle:nil]; // Nibファイルから読み込む
if( ap_imagevctr )
{
[UIView beginAnimations:nil context:NULL]; // アニメ開始定義
[UIView setAnimationDuration:1.0]; // 1秒間のアニメ
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:window cache:YES]; // カールアップアニメを実行する
[window addSubview:ap_imagevctr.view]; // ビュー切り替え
[UIView commitAnimations]; // アニメ開始
ap_imagevctr.im_view.image=image; // 画像をUIImageViewへ代入
}
}

このメソッドを実行するには、先んじてInterface BuilderでImageViewController.xibを作成してプロジェクトに登録しておく必要があります。このビューコントローラのビューには、UIImageViewを最大サイズで配置します。最終的には、ここに画像が表示されることになります。このUIImageViewは ImageViewControllerクラスのインスタンス変数im_view(IBOutlet)へリンクされています。
@class ImageViewController;
@interface ImageViewController : UIViewController
{
IBOutlet UIImageView *im_view; // イメージビュー
}
@property(nonatomic,assign)UIImageView * im_view;
- (void)close;
@end

上記がクラス定義のImageViewController.hです、ImageViewController.mには、画像表示を終了させて元のテーブルビューに戻す処理を実装します。以下のcloseメソッドがそれを担当します。
- (void)close // イメージビューを閉じる
{
UIWindow *window;
[UIView beginAnimations:nil context:NULL]; // アニメ開始定義
[UIView setAnimationDuration:1.0]; // 1秒間のアニメ
window=[UIApplication sharedApplication].keyWindow;
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:window cache:YES]; // カールダウンアニメを実行する
[self.view removeFromSuperview]; // ビューを外す
[UIView commitAnimations]; // アニメ開始
self.im_view.image=nil; // UIImageViewの画像を解除
}
この処理を実行するタイミングは、タッチエンドイベントを受け取った時とします。つまり、ImageViewControllerに実装したtouchesEnded:withEvent:メソッド内で実行します。これにより、スクリーンのどこを触っても画像表示は終了することになります。
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event // タッチ終了
{
[self close];
}
今回は、単純にファイルとして保存された画像表示しただけです。実際には、この画像を使い「対称処理」行うことになります。次回は、その準備として、ImageViewControllerへの切り替え方法を再考し、各機能ボタンを配置するためのツールバーも配置してみたいと思います。