委派更改意外

时间:2012-07-24 05:19:30

标签: ios objective-c delegates

我有一个委托ExampleDelegate,我有一个UITableViewController和详细的UIViewController都实现了该委托:

@interface ClassA : UITableViewController <ExampleDelegate>

@interface ClassB : UIViewController <ExampleDelegate>

和委托:

@protocol ExampleDelegate <NSObject>

-(void)notifyUser;

@end

@interface Example : NSObject

@property (nonatomic, retain) id delegate;

-(id)initWithDelegate:(id<ExampleDelegate>) delegate;

@end

首先我正在从ClassA初始化委托实例并且它正常工作但是一旦我导航到ClassB,我还在为ClassA创建一个实例,当我回到ClassA时,委托实例得到保留ClassB,因此总是调用ClassB中的函数而不是ClassA的函数。 任何人都可以指出我做错了什么以及如何使这个工作?

3 个答案:

答案 0 :(得分:0)

你需要确保一旦不需要你就把你的代表弄清楚 - 这将有助于你实现两件事:

  1. 将正确的类传递给它在可见时需要处理的正确委托。
  2. 防止崩溃,以便在类被解除分配并被定义为委托时,您可能会收到“发送到解除分配的实例的消息”崩溃。
  3. 在您的情况下,一旦ClassB返回到ClassA,您必须确保ClassA已定义该委托,并且ClassB的委托属性为nil。

答案 1 :(得分:0)

您是否打算让B类成为A类的代表,以便它可以使用-notifyUser方法回调?如果是这种情况,您不需要初始化程序,并且您应该将B类的委托属性声明为...

@property (assign, nonatomic) id <ExampleDelegate> delegate;

然后,如果我正确地关注您,当您创建细节控制器(B类)时,您将其delegate属性设置为self(A类)。现在,当B类需要与A类进行通信时,它只需要在其代理上调用-notifyUser就好了......

// Something happened that you want to communicate back up the chain
[self.delegate notifyUser];

当您使用此模式时,协议通常在类上声明,该类也实现了要设置的属性,在本例中为B类。

答案 2 :(得分:0)

我在代码中做了一些更改以避免上述问题,如下所示,

在调用Example中的方法之前的ClassA中,我添加了以下代码,

if(![[exampleInstance delegate]isKindOfClass:[ClassA class]]]) {
    [exampleInstance setDelegate:self];
}
[exampleInstance method1];

修改 在这两个类中,我将委托声明为strong变量,需要声明为weak,因为我通过一些文档来改变这一点,我们不必担心其余的。

感谢你们给予了很多帮助的答案。