1

ViewController1 と ViewController2 という 2 つのビュー コントローラーがあります。ViewController2 をロードするときに、ViewController1 からモーダル セグエが呼び出されます。ViewController2 が表示されているときに、ある時点で呼び出す必要がある ViewController1 のメソッドがあります。私の考えは、メソッドにアクセスできるように、ViewController1 への参照である ViewController2 にプロパティを設定することです。

@property (強力、非アトミック) ViewController1 *vc1Reference;

このプロパティは、次のように prepareForSegue メソッドで設定されます。

- (void)prepareForSegue:(UIStoryboardSegue *)segue 送信者:(id)送信者 { // 1
    if ([[セグ識別子] isEqualToString:@"sequeToVC2"]) { // 2
        ViewController2 *vc2 = segue.destinationViewController; // 3
        vc2.vc1Reference = (ViewController1*)segue.sourceViewController; // 4
    }
}

ただし、4行目で次のエラーが発生します。Objective-Cポインターから「int *」への暗黙的な変換は、ARCでは許可されていません。

参照を設定するにはどうすればよいですか?

4

3 に答える 3

3

あなたは正しい道を進んでいますが、これを行う正しい方法はデリゲートを使用することです。

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 に渡すことができます。

もっと詳しく...

  1. これはあなたの正しい形です

    @property (strong, nonatomic) ViewController1 *vc1Reference;
    

    参照の使用に注意してくださいweakstrongプロトコルで指定したメソッドを処理できることを除いて、デリゲートとは何の関係も持ちたくないので、参照を作成したくありません。多くの場合、デリゲートはデリゲータを作成したオブジェクトでありstrong、逆方向の参照を作成すると、どちらのオブジェクトも消滅しないため、メモリ リークが発生する可能性があります。

  2. これはあなたの行の正しい形式です:

    vc2.vc1Reference = (ViewController1*)segue.sourceViewController;
    

    1 または 2 で型/キャストを使用していないことに注意してください。コードの再利用/分離を最大限にするために、セグエのどちらかの端にあるオブジェクトの型について推測したくありません。「prepareForSegue」が vc1 にあると想定しています。そうでない場合、行は次のようになります。

    vc2.delegate = segue.sourceViewController
    
  3. これはプロトコル宣言です。これは、vc2 のヘッダー ファイルに入ります。vc2 は、デリゲートになることを選択したオブジェクトの期待を公開しています。vc2 はこのプロトコルに従ってメッセージを送信するため、デリゲートは正しい方法で応答する必要があります。この種のメッセージパッシングを使用して、vc2 での障害を防ぐことができます。

    if (self.delegate respondsToSelector:@selector('delegateMethod')
    {
        [self.delegate delegateMethod];
    }
    

    (これは、vc2 で vc1 に通信するために使用する種類のメッセージ パッシングの例です。明らかに、必要に応じてパラメーターを渡し、返された結果を取得できます)

  4. これは、プロトコルの実装に失敗した場合に警告を発行できるコンパイラのヘルパーです。

    最後に、オブジェクト定義のどこかにメソッドを実装する必要があります。

    - (void) delegateMethod 
    {
        // someaction;
    }
    
于 2013-01-09T04:29:52.033 に答える
1

先日、似たようなものに出くわしました。最終的にvc2のデリゲートを作成し、

vc2.delegate = self;

代わりにセグエで。これで問題は解決しますか?代理人の設定についてサポートが必要な場合は、お知らせください。できる限りサポートさせていただきます。

于 2013-01-09T04:25:07.227 に答える
0

デリゲートにアクセスしているViewControllerにデリゲートを追加するだけで、XCode / Obj-Cはその後正しいことを行うようです。

前:

@interface ViewController2 : UIViewController

@end

後:

@interface ViewController2 : UIViewController
  @property (nonatomic, weak) id <UIPageViewControllerDelegate> delegate;
@end
于 2015-01-27T20:55:53.137 に答える