2011年12月6日火曜日

画面遷移の3パターン

こんにちは、こーじーです。

iPhoneアプリの開発を始めて僕が最初にハマったのは画面遷移です。
画面を移動する為に主に3つの方法があるのですが、そのうちNavigationControllerを使う方法でかなりはまりました。
基底となるViewControllerを設定していなかったり、もともとIBを使わずにコードだけで画面を作っていたものを後からXib化すると動かないとか。


3つの方法って?という方もいらっしゃるのではないでしょうか?



これです!
 1、 AddSubViewを使ったパターン
 2、 modalViewを使ったパターン
 3、   NavigationControllerを使ったパターン


そのうち一番めんどうなのがNavigationControllerを使ったパターンだと思いますねー

基本となるのが1番目のAddSubViewのパターンです。
でも、僕が一番好きなのは2番のパターンなのでこちらから。







modalViewControllerのパターン
-(void)ch{

    SecondViewController * viewController =
[[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
[self presentModalViewController:viewController animated:YES];
[viewController release];}


戻る側のViewには
-(void)back{
   [self dismissModalViewControllerAnimated:YES];
}


このパターンは戻る側のコードが変化しないで書けるので、
ViewControllerを部品化しやすいのと、
アニメーションが簡単なのが便利です。



UIViewControllerのプロパティmodalTransitionStyleを変更することでアニメーションを変化させることができます。
  • UIModalTransitionStyleCoverVertical
    • 下から上にせり出してくる。デフォルトはこれ。
  • UIModalTransitionStyleCrossDissolve
    • 画面がフェードアウト、フェードインする
  • UIModalTransitionStyleFlipHorizontal
    • 水平方向に画面がくるっと回る(フリップする

使い方は、呼び出し側でviewControllerインスタンスを生成して
[self present〜 を呼び出す前に

viewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;  
などの一行を書くだけ。








AddSubViewパターン
これはViewControllerのインスタンスを作ってaddSubViewするだけです。
コードで書くと

-(void)ch{
    SecondViewController * viewController =
[[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
[self.view addSubView:viewController.view];
[viewController release];
 }

戻る側のSecendViewControllerの実装は
-(void)back{
    [self.view removeFromSuperView];
 }


NavigationControllerパターン
  
まずAppDelegateに宣言をします。
// ヘッダにて宣言を追加
@interface AppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
        UIViewController* rootController;
     FirshViewController* viewController;
 



つづいて、起動時に呼び出されるメソッドに記述をします。
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   
   
    FirstViewController *top = [[[instrumentViewController alloc]init]autorelease];
   
    //起点となるViewControllerを設定
    rootController = [[UINavigationController alloc]initWithRootViewController:top];
   
    // Add the view controller's view to the window and display.
    [window addSubview:rootController.view];
    [window makeKeyAndVisible];


これでNavigationControllerによる画面遷移の準備が整いました。

次にFirstViewContollerから次のViewに画面遷移するコードです。
   
-(void)ch{ 

SecondViewController *viewController = [[Config alloc] initWithNibName:@"SecondViewController" bundle:nil];  //これはxibからViewVontrollerのインスタンスを作っている。

.ctrl = self;//値を設定するものがあればここで入れる

    if(conf){
        [self.navigationController pushViewController:viewController animated:YES];
    }
}
}


この方法で画面遷移すると、移動後のViewにNavigationBarと戻る為のボタンが自動で表示されます。NavigationControllerのスタック領域にViewControllerのインスタンスをPushして画面を移動し、戻るとPopされて格納したデータが破棄されます。

動き的にブラウザのリンクを辿っていって、戻るボタンで戻るといった動きと同じと思っていただければイメージしやすいですね^^
スタックとは要するに後入先出しのデータ格納領域のことです。

もちろんこの領域に直接アクセスして画面遷移することもできます。
例えば、今は5番目の画面だけれど2番目に開いた画面に戻るとか。




ではまた!






※NavigationControllerパターンについては、オレオレテンプレートを作るにちょっと詳しく書き直しましたw




  

0 件のコメント:

コメントを投稿