Ios 具有三个视图控制器的代理

Ios 具有三个视图控制器的代理,ios,xcode,Ios,Xcode,所以我有3个视图,如下所示:viewController>>viewController2>>viewController3。 在viewController3中,我创建了一个委托协议。协议方法是一种打印NSLog的简单方法 当我从ViewController3调用代理时,只有其父级(viewController2)响应,而不是(第一个)viewController。并没有错误。我认为问题与[v2 setDelegate:self]有关;在viewController.m文件中。 然而,[sel

所以我有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
**ViewController.h**
#进口
#导入“ViewController2.h”
#导入“ViewController2.h”
@界面ViewController:UIViewController{
ViewController2*v2;
}
@属性(强,非原子)ViewController2*v2;
>大宗报价
-(iAction)按钮:(id)发送方;
@结束
>**ViewController.M**
#导入“ViewController.h”
@界面视图控制器()
@结束
@实现视图控制器
@合成v2;
-(iAction)按钮:(id)发送者{
v2=[[ViewController2 alloc]initWithNibName:@“ViewController2”捆绑包:nil];
[v2 setDelegate:self];
[self.view addSubview:v2.view];
}
-(作废)打印:(BOOL)成功;{
如果(成功==是){
NSLog(@“调用ViewController”);
}
}
@结束
>>ViewController2.h
#进口
#导入“ViewController3.h”
@界面ViewController2:UIViewController{
ViewController3*v3;
}
@属性(强,非原子)ViewController3*v3;
@属性(保留)id委托;
-(iAction)按钮:(id)发送方;
@结束
ViewController2.m
#导入“ViewController2.h”
@界面ViewController2()
@结束
@实现视图控制器2
@综合v3,代表;
-(iAction)按钮:(id)发送者{
v3=[[ViewController3 alloc]initWithNibName:@“ViewController3”捆绑包:nil];
[self.v3 setDelegate:self];
[self.view addSubview:v3.view];
}
-(作废)打印:(BOOL)成功;{
如果(成功==是){
NSLog(@“调用ViewController2”);
}
}
@结束
>ViewController3.h
#进口
@协议密码数据
@必需的
-(作废)打印:(BOOL)成功;
@结束
@界面ViewController3:UIViewController{
id代表;
}
@属性(保留)id委托;
-(iAction)调用按钮:(id)发送方;
@结束
ViewController3.m
#导入“ViewController3.h”
@界面ViewController3()
@结束
@实现视图控制器3
@综合代表;
-(iAction)调用按钮:(id)发送方{
//召集所有代表
[[自我授权]打印:是];
}
@结束

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

问题中的代码格式不好(许多空行)且难以阅读。第一种猜测是,当您第二次设置代理时,您将覆盖第一次设置。一个委托ivar当然只能持有一个引用。@Andrey-umm。。。我认为你是对的-setDelegate正在被覆盖。如果是这种情况,如何在两个或多个不同的ViewController中同时调用委托方法。我的理解是-对于要成为委托的viewController,它必须实现的事情之一是setDelegate。????这有意义吗???@pete你是在问我还是rokjarc?@Andry-对不起,我是说你。@Rokar-对不起,我真的在这里睡了半个觉。再一次,我想请你帮忙。非常感谢。你的回答非常准确,直截了当。现在我可以继续学习有关NSNotification的所有内容。再次感谢。