あなたは正しい道を進んでいますが、これを行う正しい方法はデリゲートを使用することです。
vc2 でデリゲート プロパティを宣言します@interface
。
@property (nonatomic, weak) id <vc2delegate> delegate //[1] (in vc2.h)
そして、デリゲートを次のように設定しますprepareForSegue
。
vc2.delegate = self; //[2] (in vc1.m)
(「self」は、vc1 からの vc1 の正しい参照です)
vc2 では、vc1 が vc2 から応答することを期待するメソッドであるプロトコルを定義します。これを vc2.h の@interface
@protocol vc2delegate //[3] (in vc2.h)
- (void) delegateMethod;
@end
次に、そのメソッドを vc1 に実装する必要があります。また、デリゲートに準拠することを vc1 に知らせる必要があります。vc2 を vc1.h にインポートし@interface
、vc1 の行にプロトコル名を山かっこで囲んで追加します。
#import vc2.h
@interface vc1 <vc2delegate> //[4] (in vc1.h)
#include
この配置により、vc2 は vc1 にメソッドを渡したり、それについて何も知らなくても、メソッドを vc1 に渡すことができます。
もっと詳しく...
これはあなたの正しい形です
@property (strong, nonatomic) ViewController1 *vc1Reference;
参照の使用に注意してくださいweak
。strong
プロトコルで指定したメソッドを処理できることを除いて、デリゲートとは何の関係も持ちたくないので、参照を作成したくありません。多くの場合、デリゲートはデリゲータを作成したオブジェクトでありstrong
、逆方向の参照を作成すると、どちらのオブジェクトも消滅しないため、メモリ リークが発生する可能性があります。
これはあなたの行の正しい形式です:
vc2.vc1Reference = (ViewController1*)segue.sourceViewController;
1 または 2 で型/キャストを使用していないことに注意してください。コードの再利用/分離を最大限にするために、セグエのどちらかの端にあるオブジェクトの型について推測したくありません。「prepareForSegue」が vc1 にあると想定しています。そうでない場合、行は次のようになります。
vc2.delegate = segue.sourceViewController
これはプロトコル宣言です。これは、vc2 のヘッダー ファイルに入ります。vc2 は、デリゲートになることを選択したオブジェクトの期待を公開しています。vc2 はこのプロトコルに従ってメッセージを送信するため、デリゲートは正しい方法で応答する必要があります。この種のメッセージパッシングを使用して、vc2 での障害を防ぐことができます。
if (self.delegate respondsToSelector:@selector('delegateMethod')
{
[self.delegate delegateMethod];
}
(これは、vc2 で vc1 に通信するために使用する種類のメッセージ パッシングの例です。明らかに、必要に応じてパラメーターを渡し、返された結果を取得できます)
これは、プロトコルの実装に失敗した場合に警告を発行できるコンパイラのヘルパーです。
最後に、オブジェクト定義のどこかにメソッドを実装する必要があります。
- (void) delegateMethod
{
// someaction;
}