[iPhone] モーダルビューの非表示、値の受け渡しはデリゲートで行う
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]; }
関連する投稿
4 comments
コメントをどうぞ
Additional comments powered by BackType
参考になりました。ありがとうございます。
ただ、ModalViewController.mの12行目の[delegate updateInputValue:_textField.text]; は
[delegate updateTextField:_textField.text];
の間違いかと思います。
こばさん、ご指摘ありがとうございました。
修正させていただきました。
http://www.syuhari.jp/blog/archives/2079
This comment was originally posted on Twitter
1bernard…
…