So-net無料ブログ作成
検索選択

iPhoneSDKというかObjective-Cでコールバック [iphone]

ViewBのボタンを押すとViewAのメソッドを呼び出したいとき。

ViewAで呼ばれるメソッドを作る
// ViewA.h
- (void) backToMenuCallback:(BaseViewController*)sdr withValue:(NSNumber*);


// ViewA.m
- (void) backToMenuCallback:(BaseViewController*)sdr withValue:(NSNumber*) {
    // do something
}


ViewBにセレクタとViewAのインスタンスを保持しておく
//ViewB.h
@interface ViewB : UIViewController {
	SEL OnClick;
	NSObject* target;
}
//セッターも作っておく
- (void)setHandler:(SEL) method: (NSObject*) eventDest;


// ViewB.m 
- (void)setHandler:(SEL) method: (NSObject*) eventDest {
	OnClick = method;
	target = eventDest;
}


これらの変数にプロパティやセッターやらで設定しておく。
// ViewA.m
SEL s = @selector(backToMenuCallback:withValue:);
[viewcon setHandler:s :self];


ViewBのボタン押下のイベントハンドラでOnClickを呼び出す
// ViewB.m
[target performSelector:OnClick withObject:self withObject:[NSNumber numberWithInt:(int)TransitToSetting]];
selfと[NSNumber...]は引数で渡したいオブジェクトを入れる。


こうすれば、ViewBのボタンでViewAのメソッドが呼ばれる。
別にUIViewControllerの派生クラスでなくても何でもよいのですが、
一般的なのでそのまま残しておきます。

----

これで満足していたらなにやらイベントディスパッチャーを使ったイベント処理
があるそうではないですか!イベント処理の方が行儀が良いのでそのやり方を。

ViewAで呼ばれるイベントハンドラ定義
// ViewA.h
- (void) transitView:(NSNotification*)note;


ViewAのDidLoadとかでイベントリスナに登録
// ViewA.m
// "MyEvent"という名前のイベントが発行されたらtransitViewが呼ばれる
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(transitView:) name:@"MyEvent" object:nil];


ViewBからイベント発行
// ViewB.m
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
// イベントをポスト。argはイベントハンドラに渡す引数
[center postNotificationName:@"MyEvent" object:arg];


// ViewA.m
- (void) transitView:(NSNotification*)note {
        // argを取り出す
	id obj = [note object];
}


ディスパッチャーはcocoa touchのフレームワークだそうです。
こっちのほうがわかりやすいかな。引数が1こまでですが、
むしろなぞの引数がたくさんあるより、自前引数クラスで
管理したほうがわかりやすいので問題なしかな。
うーん、いろいろ知らないことたくさんあるなー。

タグ:iPhone
nice!(0)  コメント(0)  トラックバック(1) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 1

この記事のトラックバックURL: