[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
hitode909 への返信 コメントをキャンセル
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…
…