ViewControllerを切り替える

TabBarに引き続き、複数のViewControllerを切り替える方法。
意外とあっさりだが、やはりハマりどころがあったので、メモをしておく。

ケルトンプロジェクトを作成

View-based Applicationで、プロジェクト名は「ViewChangeEX」。

新しいViewControllerを追加

"ファイル"->"新規ファイル"で"UIViewController subclass"を作成、"With XIB for user interface"にチェックを入れる、ファイル名は"ViewChangeEXSecondViewController"、ヘッダーファイルも生成するようにチェックを入れる。
これで、ヘッダー、モジュール、XIBの3つのファイルができる。

新しいViewControllerへの参照を"ViewChangeEXAppDelegate"に追加

ヘッダーに、以下の通り追加。


@class ViewChangeEXViewController;
@class ViewChangeEXSecondViewController;
@interface ViewChangeEXAppDelegate : NSObject {
UIWindow *window;
ViewChangeEXViewController *viewController;
ViewChangeEXSecondViewController* sencondviewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet ViewChangeEXViewController *viewController;
@property (nonatomic, retain) IBOutlet ViewChangeEXSecondViewController* secondviewController;
@end

モジュールの先頭に以下を追加

#import "ViewChangeEXAppDelegate.h"
#import "ViewChangeEXViewController.h"
#import "ViewChangeEXSecondViewController.h"

@implementation ViewChangeEXAppDelegate

@synthesize window;
@synthesize viewController;
@synthesize secondviewController;

MainWindow.xibへ、新しく作った"ViewChangeEXSecondViewController"を追加する

  • "MainWindow.xib"を(Interface Builderで)開く
  • Libraryを開き、ViewControllerを選んで、XIBウィンドウにドロップ
  • Identity Inspectorで参照クラスを"ViewChangeEXSecondViewController"に変更
  • XIBウィンドウで、"ViewChangeEX App Delegate"を右クリック(=二本クリック)し、"Outlets"の"secondviewController"を、上で追加したViewControllerとつなぐ


これを、忘れていたため、今回はハマった。
これをしないと、SecondViewControllerをaddしても、Windowに追加されないのだ。

"ViewChangeEXAppDelegate"にViewControllerを切り替えるメソッドを追加

モジュールに以下を追加。


- (void) change1to2
{
// [ viewController.view removeFromSuperview ];
// [ window addSubview: secondviewController.view ];
[ UIView transitionFromView:viewController.view
toView:secondviewController.view
duration:1.0
options:UIViewAnimationOptionTransitionFlipFromRight
completion:nil ];
}

- (void) change2to1
{
// [ secondviewController.view removeFromSuperview ];
// [ window addSubview: viewController.view ];
[ UIView transitionFromView:secondviewController.view
toView:viewController.view
duration:1.0
options:UIViewAnimationOptionTransitionFlipFromLeft
completion:nil ];
}

各ViewControllerにViewControllerを切り替えるメソッドを追加

ヘッダーに、


- (IBAction) change;
モジュールに、

- (IBAction) change
{
ViewChangeEXAppDelegate* appDelegate = (ViewChangeEXAppDelegate*) [ [ UIApplication sharedApplication ] delegate ];
[ appDelegate change1to2 ];
}
みたいな感じ。

各ViewControllerのxibを開いて、メソッドを呼ぶボタンを配置して、メソッドとつなぐ。

後はビルドすれば、ボタンを押すとデフォルトのViewControllerと追加したViewControllerを行ったり来たりできるはずだ。