0

したがって、次の 3 つのビューがあります: viewController >> viewController2 >> viewController3。viewController3 でデリゲート プロトコルを作成しました。プロトコル メソッドは、NSLog を出力する単純なメソッドです。

ViewController3 からデリゲートを呼び出すと、(最初の) viewController ではなく、その親 (viewController2) のみが応答します。エラーはありません。問題は [v2 setDelegate:self]; に関係があると思います。viewController.m ファイルで。それにもかかわらず、[self.v3 setDelegate:self]; ViewController2.m ファイルで正常に動作します。

(最初の) viewController デリゲートが応答しないのはなぜですか? デリゲートは直接の子でのみ機能しますか??

> **ViewController.h**
   #import <UIKit/UIKit.h>
   #import "ViewController2.h"
   #import "ViewController2.h"
   @interface ViewController : UIViewController <PassData>{

    ViewController2 *v2;
   }
   @property (strong, nonatomic) ViewController2 *v2;

> Blockquote

    - (IBAction)button:(id)sender;
    @end

> **ViewController.M**

    #import "ViewController.h"

   @interface ViewController ()

   @end

   @implementation ViewController
   @synthesize v2;

    - (IBAction)button:(id)sender {

    v2 = [[ViewController2 alloc]initWithNibName:@"ViewController2" bundle:nil];
    [v2 setDelegate:self];
    [self.view addSubview:v2.view];
    }

    -(void)print: (BOOL)success;{

    if (success == YES) {
        NSLog(@"ViewController called");
    }

    }

    @end

> > ViewController2.h

   #import <UIKit/UIKit.h>
   #import "ViewController3.h"

    @interface ViewController2 : UIViewController <PassData> {

    ViewController3 *v3;

     }
     @property (strong, nonatomic)ViewController3 *v3;
     @property (retain) id delegate;

   - (IBAction)button:(id)sender;
     @end

   ViewController2.m

   #import "ViewController2.h"

    @interface ViewController2 ()

     @end

    @implementation ViewController2
   @synthesize v3,delegate;

     - (IBAction)button:(id)sender {

    v3 = [[ViewController3 alloc]initWithNibName:@"ViewController3" bundle:nil];
    [self.v3 setDelegate:self];
    [self.view addSubview:v3.view];

     }

    -(void)print: (BOOL)success;{

    if (success == YES) {
          NSLog(@"ViewController2 called");
    }
    }
     @end

> ViewController3.h

   #import <UIKit/UIKit.h>

    @protocol PassData <NSObject>

    @required

    -(void)print:(BOOL)success;

    @end

    @interface ViewController3 : UIViewController {

    id<PassData>  delegate;

     }

    @property (retain) id delegate;

   - (IBAction)callButton:(id)sender;

    @end

     ViewController3.m

    #import "ViewController3.h"

    @interface ViewController3 ()

    @end

    @implementation ViewController3
    @synthesize delegate;

    - (IBAction)callButton:(id)sender {

    // call all delegates
      [[self delegate]print:YES];

     }
    @end
4

1 に答える 1

1

v2 にはメソッド「print」がありません。これは v3 のプロトコル メソッドです。このようにデリゲート メッセージをチェーンすることはできません。複数のコントローラーが別のコントローラーの何かに応答するようにしたい場合は、NSNotification を使用する必要があります。通知を受信するためにオブジェクトをいくつでも登録できます。

于 2013-01-23T17:08:26.277 に答える