代表有三个viewControllers

时间:2013-01-23 12:58:31

标签: ios xcode

所以我有3个视图如下:viewController>> viewController2>> viewController3。 在viewController3中,我创建了一个委托协议。协议方法是打印出NSLog的简单方法。

当我从ViewController3调用委托时,只有它的父(viewController2)不响应(第一个)viewController。没有错误。我认为问题与[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

1 个答案:

答案 0 :(得分:1)

v2没有方法“print”,这是v3的协议方法 - 你不能像这样链接委托消息。如果您希望多个控制器响应另一个控制器中的某些内容,那么您应该使用NSNotification - 任何数量的对象都可以注册以接收通知。