这个解释起来比较棘手:我ClassA
有MethodA
,它会对ClassA
中的某些对象执行某些操作,假设它设置了几个标签。
ClassA还创建了ClassB
的实例,这是一个侧边栏视图。我需要ClassB对ClassA中的对象执行与MethodA相同的内容,更新ClassA实例中的那些标签。
我需要ClassB才能调用MethodA,但让它对创建ClassB实例的ClassA的特定实例起作用。
这些类(至少目前)不会相互继承,因为它们实际上并没有共享任何东西。我将ClassA中的一些数据填入ClassB的标签中,现在我需要做相反的事情。
我不能在ClassB中调用[super MethodA]
,因为它们不会继承。我需要的是类似于[parent methodA]
的东西,它会在创建此ClassB对象的类中调用该方法,并让它在ClassA的特定实例上执行。
这样的事情存在吗?道歉,混乱的帖子,我不知道该搜索一个模糊的问题是什么。
答案 0 :(得分:0)
您需要自己创建。一般模式是在子类中创建一个侦听器赋值,“父”(更一般地说,想要接收通知的对象)调用您建立的方法来分配侦听器。如果您愿意,您可以允许您的孩子维持多个听众,或者只允许一个听众。监听器应该实现一些适合您计划传递数据的协议。
答案 1 :(得分:0)
不,如果您正在使用合成,那么您需要一种外部方式来引用包含客户端的类。
更简单的方法是在实例化对象时传递父对象:
@interface ClassB {
ClassA *parent;
}
-(id)initWithA:(ClassA*)parent;
@property (readonly, retain) ClassA *parent;
@end
@implementation ClassB
-(id)initWithA:(ClassA*)parent {
if ((self = [super init])) {
self.parent = parent;
}
return self;
}
@end
这样你就可以进入ClassB
:
-(void)method {
[parent updateThings:params];
}
请注意,在这种情况下,由于两个类声明都是交叉引用的,因此您需要在头文件中使用前向声明(例如@class ClassA
)来进行编译。