今更かもしれませんが、UIViewControllerのモーダル表示について ごく簡単に説明。
※ios5より[self presentModalViewController:controlleranimated:YES];は非推奨となっているため下記のpresentViewControllerを使うのが望ましいと思います。基本的な使い方は同じです。またcompletion:でメソッドを呼ぶことができますが、必要が無ければnilを入れてください。
例 [self presentViewController:controller animated:YES completion:nil];
戻りは[self.modalViewController dismissModalViewControllerAnimated:YES];としていましたが同様にdismissViewControllerを使いましょう。self.modalViewController はselfのみでOKです
AViewController 及びBViewControllerに実装されているIBAction はそれぞれに定義しているbutton1,button2を押したときに呼ばれるものと想定してください。
親コントローラー(AViewController)、子コントローラー(BViewController)とします。
親コントローラーのボタン(button1)を押すと、子コントローラーが表示されるといった感じです。
また子コントローラー(BViewController)のボタン(button2)押すと子コントローラーが消え、親コントローラーが表示されます。
AViewController.h
#import <UIKit/UIKit.h>
#import "BViewController.h"
@interface AViewController : UIViewController <BViewControllerDelegate> { // ←<BViewControllerDelegate>により親子関係を築きます
}
@property (strong, nonatomic) IBOutlet UIButton *button1;
- (IBAction)button1Action:(id)sender;
@end
AViewController.m
#import "AViewController.h"
@implementation AViewController
@synthesize button1;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)viewDidUnload {
[self setButton1:nil];
[super viewDidUnload];
}
///----------- 中略----------------
- (void)backFromModalB {
// 子コントローラー(BViewController)にてbutton2を押したときにここを参照する。
[self.modalViewController dismissModalViewControllerAnimated:YES]; // ←ここが重要(self.modalViewControllerにはBViewControllerが入っている)
}
- (IBAction)button1Action:(id)sender {
// 子コントローラーを参照し、デリゲート設定する
BViewController *controller = [[BViewController alloc]initWithNibName:@"BViewController" bundle:nil]; // ←ここが重要
controller.delegate = self; // ←ここが重要
// 回転しながら子コントローラーを表示
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES]; // ←ここが重要
}
@end
BViewController.h
#import <UIKit/UIKit.h>
@protocol BViewControllerDelegate <NSObject> // ←ここが重要
- (void)backFromModalB ; // ←AViewController.mにて実装されている
@end
@interface BViewController : UIViewController {
_weak id <BViewControllerDelegate>delegate; // ←ここが重要
}
@property (nonatomic, weak) id <BViewControllerDelegate>delegate; // ←ここが重要
@property (nonatomic, strong) IBOutlet UIButton *button2;
- (IBAction) return:(id) sender;
@end
BViewController.m
#import "BViewController.h"
@implementation BViewController
@synthesize delegate;
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)viewDidUnload {
[self setDelegate:nil];
[super viewDidUnload];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
- (IBAction) return:(id) sender {
}
@end
※注意 子コントローラーにてdelegate のpropertyを'strong' に設定すると循環参照となり、メモリリークとなります。