2011年05月09日

removeFromSuperviewでdelegate(ハンドラー)を追加する方法

以前(ず〜っと前)にiPhoneのプログラミングでdelegate = (javaで言う)ハンドラーでほぼ間違いないという事を書いたと思う。

でその活用法を今日試行錯誤してあみ出した!(^^;

例えば、
mainViewControllerからsubViewControllerを呼び出した場合。
subViewControllerで、
[self.view removeFromSuperview]
をおこなった時にmainViewControllerでハンドル出来るメソッドは用意されていない。

loadView, viewDidAppear, viewWillAppear, 等、既存のdelegateメソッドはコールされなかった。

では、subViewControllerでremoveFromSuperviewを行った直後、mainViewControllerで何かを行いたい場合はどうするか。。。?

答えは、protocolを使用しdelegate(ハンドラー)をmainViewControllerに追加する


まずはprotocolを作成。
protocolは.hファイルで作成する。
今回はMainSubViewProtocol.hとした。


#import

@protocol MainSubViewProtocol

-(void) hideSubView:(UIViewController *)viewController;

@end


この使用をmainViewController.hで宣言。

#import "MainSubViewProtocol.h"
#import "SubViewController.h"

@interface MainViewController : UIViewController <MainSubViewProtocol>{
:
:
}
:
-(IBAction) switchingViews;
:
@end


MainViewController.mでprotocolメソッドであるhideAnswerViewを実装し、subViewControllerをinitするときに、subViewController.delegate = selfとしてハンドラーを設定。

:
-(void) hideAnswerView:(UIViewController *)viewController {
NSLog(@"MainSubViewController hideAnswerView");
}

:
:
-(IBAction)switchingViews {
:
subViewController = [[SubViewController alloc] initWithNibName:@"SubViewController" bundle:[NSBundle mainBundle]];
subViewController.delegate = self;
:
[self.view addSubview:subViewController.view];
}



SubViewController.hでdelegateインスタンスを用意してやる。

#import "MainSubViewProtocol.h"

@interface SubViewController : UIViewController {
id delegate;
:
}
:
@property (assign) id delegate;
:
-(IBAction) switchingViews;
:
@end


SubViewController.mで呼び出したい場合にdelegateメソッドをコールする。


@implementation SubViewController

@synthesize delegate;
:
:
-(IBAction) switchingViews {
[self.view removeFromSuperview];
[delegate hideAnswerView:self];
}
:


これで、
subViewControllerでremoveFromSuperViewをやった直後にmainViewControllerで宣言したhideAnswerViewメソッドがコールされる。

以上。
posted by 1.618 at 15:56| Comment(0) | iPhone | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は180日以上新しい記事の投稿がないブログに表示されております。