ユーザーが「追加」ボタンを押すと、情報を入力するためのモーダルビューがポップアップ表示されます。ナビゲーションバーの左上に「キャンセル」ボタンがあり、現在のViewControllerが押されたときにそれを閉じたいと思っています。オブジェクトをクラスのデリゲートとして設定するにはどうすればよいですか?プロトコルの作成とそのメソッドの実装は理解していますが、デリゲートを設定できないようです。デバッガーを実行する場合[self delegate]
、「追加」ビューコントローラーのmyは常にnil
です。
3 に答える
@interface MyViewController : UIViewController {
id delegate;
}
@property (nonatomic,retain) id delegate;
@synthesize delegate;
これでうまくいくはずです。[MyViewController setDelegate:self]
モーダルビューを表示する前に使用[[self delegate] dismissModalViewControllerAnimated:YES]
して、キャンセルボタンをタップしたイベントを呼び出すことができます。MyViewController
IBでビューを作成した場合は、Controlキーを押しながらボタンをViewControllerのヘッダーファイルにドラッグし、IBOutletを追加します。.mファイルのそのメソッド内で次のことができます
[self dismissModalViewControllerAnimated:YES];
または、プログラムでボタンを作成することもできます。
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(processCancel:)];
-(void)processCancel:(UIBarButtonItem *)item{
[self dismissModalViewControllerAnimated:YES];
}
ストーリーボードに設定されたセグエを介してモーダルviewControllerを生成していますか?その場合、prepareForSegue:
メソッドでデリゲートをそこに設定します。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([identifier isEqualToString:@"userGuideSegue_home"]){
UserGuideViewController* vc = segue.destinationViewController;
[[segue destinationViewController] setDelegate:self];
}
}
一方、完全にコードを使用してモーダルviewControllerを設定する場合は、モーダルviewControllerのインスタンスを作成してから、そのデリゲートを設定します。
- (void)showModelView:(NSString*)viewName
{
// code ripped out of project so a bit specific
if ([viewName isEqualToString:@"userGuide_name"]) {
modalViewController = (UserGuideViewController * )
[[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:NULL]
instantiateViewControllerWithIdentifier:@"UserGuide"];
}
modalViewController.delegate = self;
modalViewController.modalPresentationStyle = UIModalPresentationFormSheet;
modalViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
modalViewController.view.frame = [[UIScreen mainScreen] applicationFrame];;
[self presentViewController:modalViewController
animated:YES
completion:^{
//put your code here
}];
}
もちろん、これはすべてdelegate
、モーダルviewControllerでプロパティを定義していることを前提としています。