1

私は3つのViewControllerを持っています。A、B、および C。

A は B を提示し、B は C を提示します。

C から A にデータを渡すにはどうすればよいですか?

B のデリゲートを A に設定します。

BViewController *bvc = [self.storyboard instantiateViewControllerWithIdentifier:@"B"];
bvc.delegate = self;

どうにかして C のデリゲートを A に設定できますか?

お気に入り:

CViewController *cvc = [self.storyboard instantiateViewControllerWithIdentifier:@"C"];
cvc.delegate = (self's parent delegate)

?

または、C のデリゲートを B に設定してから A にする必要がありますか?

4

2 に答える 2

2

ビューコントローラー C にデリゲートを B に設定させます。B はデリゲート A を設定します。sendMessageToA と呼ばれるメソッドが B に存在する可能性があります。したがって、C がデリゲート「sendMessageToA」を送信する時点で、B は必要なデータを A に送信できます。

または、B から A にメッセージを転送することもできます。したがって、C はデリゲート (この場合は B) にメッセージを送信します。Bさんは「このメッセージはわかりません。転送させてください」と言います。BさんがAさんにメッセージを送ります。

このリンクは、概念をうまく説明しています: http://www.mikeash.com/pyblog/friday-qa-2009-03-27-objective-c-message-forwarding.html

于 2012-06-05T16:48:33.553 に答える
0

最も確実に c のデリゲートを a または b に設定できます。b のバイパスが有効かどうかを判断する必要があります。b は、メッセージが a に戻る前に何かをしたい場合もあれば、気にしない場合もあります。したがって、b 内で c をインスタンス化する場合:

// make b the delegate of c
cvc.delegate = self;

また

// bypass b and make a the delegate of c
cvc.delegate = self.delegate;

c は、デリゲートが誰であっても、適切なセレクターに応答できることを知っている必要があります。

// in c
if ([delegate respondsToSelector:@selector(doSomething)])
{
    [delegate doSomething];
}

以下のコメントの編集:デリゲートをコントローラーに固有にする代わりに、デリゲートを説明するより一般的なプロトコルを作成できます。

@protocol InfoSelectorDelegate 
- (void)viewController:(UIViewController *)viewController didSelectInfo:(NSDictionary *)info 
@end

そして、両方のデリゲートのタイプは次のようになります。

id<InfoSelectorDelegate>
于 2012-06-05T16:44:06.067 に答える