我有一个委托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的函数。 任何人都可以指出我做错了什么以及如何使这个工作?
答案 0 :(得分:0)
你需要确保一旦不需要你就把你的代表弄清楚 - 这将有助于你实现两件事:
在您的情况下,一旦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
,因为我通过一些文档来改变这一点,我们不必担心其余的。
感谢你们给予了很多帮助的答案。