iPhone でのモーダルビューの表示、非表示、値の受け渡し方法です。モーダルビューとは、下からニョキッと出てくるタイプの一時的なビューです。何か情報を入力させたりするのに使用します。

大事な点は、

  • モーダルビューの表示、非表示は両方共同じクラスでやること
  • 値の受け渡しはデリゲートで行うこと

ということです。

サンプルでたまに見かけるのは、表示を親ビューでやり、非表示はモーダルビューの中でやっている方法です。この方法でもかまいませんが、より汎用的にするためにはデリゲートを使用して、モーダルビューを表示したビューコントローラで非表示も行うべきです。また、モーダルビューから値を渡すのもデリゲートを使用して行うべきです。

モーダルビューの例としては、UIImagePickerViewController があげられます。この UIImagePickerViewController からの値の受け取り方、モーダル表示、非表示の方法をみていただければ、上記の説明が理解しやすいかと思います。

実際の実装方法です。まず、モーダルビューとして表示されるビューのコントローラを作ります。UITextField だけのビューです。UITextField の入力値を渡すのに使用する ModalViewDelegate を作成します。UITextField で Return キーを押すと UITextField に入力した値を delegate で指定したクラスへ渡します。

ModalViewController.h

@protocol ModalViewDelegate
- (void) updateTextField:(NSString*) string;
@end

@interface ModalViewController : UIViewController <UITextFieldDelegate> {
  id delegate;
  IBOutlet UITextField* textField;
}
@property (nonatomic, retain) id delegate;
@end

ModalViewController.m

@implementation ModalViewController
@synthesize delegate;
- (void)viewDidLoad {
  [super viewDidLoad];
  textField.delegate = self;
  [textField becomeFirstResponder];
}

- (BOOL)textFieldShouldReturn:(UITextField *)_textField {
  [textField resignFirstResponder];
  if ([delegate respondsToSelector:@selector(updateTextField:)]) {
    [delegate updateTextField:_textField.text];
  }
  return YES;
}

@end

今度は実際に ModalViewController をモーダル表示させる部分と、デリゲートを実装してその処理を作成します。モーダルビューからのデリゲート updateTextField: で値を受け取り、モーダルビューを非表示にします。
ParentViewController.h

@interface ParentViewController : UIViewController <ModalViewDelegate> {

}
@implementation ParentViewController

- (void) updateTextField:(NSString *)string {
  NSLog(@"string=%@", string);
  [self dismissModalViewControllerAnimated:YES];
}

- (IBAction) start:(id) sender {
  ModalViewController* viewController = [[ModalViewController alloc] initWithNibName:@"ModalViewController" bundle:nil];
  viewController.delegate = self;
  [self presentModalViewController:viewController animated:YES];
  [viewController release];
}

関連する投稿