【iPhone】アプリ内でWEBアプリ感覚で画面遷移する

Posted by: daichi  /  Category: iphone開発

iPhoneアプリで画面遷移させる場合、コントローラをalloc/initしてナビゲーションコントローラのスタックにプッシュしたり、modalしたりする流れになるわけですが、複数の画面から呼ばれる画面だったりするとインスタンスの管理が面倒だったり、決まり文句をいちいち書くのが面倒になります。

そこでThree20のTTNavigatorを使うと、すっきり画面遷移できるようです。

webアプリ感覚で”http://about”のように遷移先を指定するだけで、その画面を表示できるようになります。
httpの部分は任意の文字列を定義できます。

そのためには、まずURLとコントローラのマッピングが必要です。

簡単にサンプルを示します。

?View Code OBJECTIVE-C
#import "DCAppDelegate.h"
#import "DCTwitterController.h"
#import "DCGoogleReaderController.h"
#import "DCAboutController.h"
#import "DCTabBarController.h"
 
@implementation DCAppDelegate
 
- (void)applicationDidFinishLaunching:(UIApplication *)application {
 
	TTNavigator *navigator = [TTNavigator navigator];
	navigator.supportsShakeToReload = YES;
	navigator.persistenceMode = TTNavigatorPersistenceModeTop;
 
	TTURLMap *map = navigator.URLMap;
	[map from:@"*" toViewController:[TTWebController class]];
	[map from:@"dc://tab" toSharedViewController:[DCTabBarController class]];
	[map from:@"dc://twitter" toViewController:[DCTwitterController class]];
	[map from:@"dc://reader" toViewController:[DCGoogleReaderController class]];
	[map from:@"dc://web" toViewController:[TTWebController class]];
	[map from:@"dc://about" toViewController:[DCAboutController class]];
	[map from:@"dc://compose?title=(compose:)" toModalViewController:[DCAboutController class]];
 
    [navigator openURL:@"dc://tab" animated:NO];
 
}
 
- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)URL {
	[[TTNavigator navigator] openURL:URL.absoluteString animated:NO];
	return YES;
}
@end


まずTTNavigatorクラスのインスタンスを取得します。
TTNavigator.supportsShakeToReloadをYESにすると、iPhoneを振ると、リロードをしてくれるようになります。
TTNavigator.persistenceModeはアプリ終了時にどの画面を開いていたかを記憶する設定です。persistenceModeAllを指定すると常に最後に開いていた画面を記憶し、次回起動時にその画面を表示するようになります。

その後のTTURLMapがURLとコントローラのマッピング情報を保持するクラスです。
from:toViewControllerメソッドでは、fromに指定されたURLが呼ばれるとtoViewControllerの画面を表示する、というような設定になります。
fromに”*”を指定すると、マッピングにないURLが指定された場合のコントローラを指定できます。

URLを指定したら、TTNavigatorのopenURL:animated:メソッドを呼べば画面遷移が行われます。

TTNavigatorはシングルトンなため、どの画面からでも同一インスタンスを取得でき、遷移したい時にopenURL:animated:メソッドを呼んでやればよい、という感じです。

TabBarコントローラのような全画面で共通で使いたいコントローラの場合は
from:toSharedViewController:メソッドを使うと一つのインスタンスを使い回せるようです。

また、コントローラに渡すパラメータも指定できます。

?View Code OBJECTIVE-C
[map from:@"dc://compose?subject=(compose:)" toModalViewController:[DCAboutController class]];

の部分がそれで、これはDCAboutControllerクラスのcompose:メソッドが呼ばれます。

パラメータの受け取りは以下のように行います。

?View Code OBJECTIVE-C
#import "DCAboutController.h"
 
@implementation DCAboutController
 
- (void)createModel {
	self.dataSource = [TTSectionedDataSource dataSourceWithObjects:
						@"About",
						[TTTableTextItem itemWithText:@"サイト" URL:@"http://iphone.longearth.net"],
						[TTTableTextItem itemWithText:@"ご意見ご要望" URL:@"dc://compose?subject=%5biSlot%20Pro%5d%e6%84%8f%e8%a6%8b%2f%e8%a6%81%e6%9c%9b"],
					   [TTTableTextItem itemWithText:@"友達にすすめる" URL:@"dc://compose?subject=&body=http%3a%2f%2fitunes%2eapple%2ecom%2fWebObjects%2fMZStore%2ewoa%2fwa%2fviewSoftware%3fid%3d304074830%26mt%3d8"],
						@"関連アプリ",
					   [TTTableTextItem itemWithText:@"iPachi" URL:@""],
					   [TTTableTextItem itemWithText:@"iSlot Pro" URL:@""],
					   [TTTableTextItem itemWithText:@"iTaskTimer" URL:@""],
						nil];
}
 
- (UIViewController *)compose:(NSString *)subject query:(NSDictionary *)param {
	TTMessageController* controller =
    [[[TTMessageController alloc] init] autorelease];
	controller.subject = subject;
	controller.body = [param objectForKey:@"body"];
	return controller;
}
@end

第一引数にはsubjectで指定したものが、第二引数以降にも&繋ぎで複数パラメータが指定でき、中身はDictionaryとして取り出すことができます。
上の例ではパラメータを受け取り、それらの値を使って、メール送信画面を起動しているところです。

createModelメソッドはTTTableViewControllerでテーブルデータを表示する際に呼ぶメソッドで、ここではあまりふれません。
が、少しだけ触れておくと、TTTableViewControllerのdatasourceがテーブルデータとなり、TTSectionDataSourceを入れています。TTSectionDataSourceは引数にNSStringがあればそれをセクション名とし、それ以降のものをセクション内に属するデータとして扱います。それからそのデータとしてTTTableTextItemがあり、textで表示する文字を、URLでタップした時の遷移先を指定しています。以上でこんな画面になります。
About画面

URL形式での画面遷移でもすごい画期的なのに、まだまだThree20にはすごい部分が盛りだくさんです。
マジすごい。

アプリをiPhone OS 3.0へ対応させる時がきました

Posted by: daichi  /  Category: iphone開発

Apple、iPhoneアプリは今後3.0互換でなければ受付けないと通告

ついにAppleが今後の提出アプリはiPhone 0S 3.0との互換性をmustにしてきました。
既存のアプリは互換性がない限りApp Store上から削除されてしまうとのこと。

iPhone OS bataでの仕様変更も概ね終了して、今後は微調整程度になるんでしょう。

続きを読む

【UIVIewController】iPhoneを横向きにした時に別画面を表示する方法

Posted by: daichi  /  Category: iphone開発

これだいぶやられました。
こんな風にただ横向きに画面を表示したいだけなのですが、ハマり倒しました。

横向き画面

二度とやられないためにもここに残します。

続きを読む

【UITableView】Groupedなテーブルのスクロールが重い

Posted by: daichi  /  Category: iphone開発

この件、前々から原因がわからずハマっていたのですが、暫定的な対処法がわかりました。

Groupedなテーブルというのは、テーブルのstyleがUITableViewStyleGroupedのテーブルのことで、こんな画面のことです。

総合画面

このようなGroupedな画面でスクロールさせると、アニメーションがコマ落ちしているような動きになっていました。

続きを読む

【UITableView】UITableViewを使って詳細画面を作る-1【UITableViewDataSource】

Posted by: daichi  /  Category: iphone開発

前回まででUITableViewでリストを表示して、
行を選択すると別画面を表示するところまで
できました。

今回は行選択時にその行の詳細画面を表示する画面を
UITableViewを使って作ります。

学べること

  • コントローラ内でのデータをビューに表示する方法
  • UITableViewに必要なもの-datasource
続きを読む

【UITableView】選択行から別画面を呼び出す

Posted by: daichi  /  Category: iphone開発

今回はUITableVIewの行をタップした時に別画面を呼び出す
部分を作ります。

行をタップした時にプログラム内部ではUITableViewDelegateで定義されている
tableView:didSelectRowAtIndexPath:メソッドが呼ばれます。

なので、このメソッド内に別画面を呼び出す処理を書いていきます。

学べること

  • Interface Builderの基本的な使い方
  • UITableViewの行選択時の動作
  • navigation Controllerによる画面遷移
続きを読む

Get Adobe Flash playerPlugin by wpburn.com wordpress themes