在创建当前类的类中调用方法?

时间:2012-12-03 17:17:06

标签: objective-c ios class methods parent-child

这个解释起来比较棘手:我ClassAMethodA,它会对ClassA中的某些对象执行某些操作,假设它设置了几个标签。

ClassA还创建了ClassB的实例,这是一个侧边栏视图。我需要ClassB对ClassA中的对象执行与MethodA相同的内容,更新ClassA实例中的那些标签。

我需要ClassB才能调用MethodA,但让它对创建ClassB实例的ClassA的特定实例起作用。

这些类(至少目前)不会相互继承,因为它们实际上并没有共享任何东西。我将ClassA中的一些数据填入ClassB的标签中,现在我需要做相反的事情。

我不能在ClassB中调用[super MethodA],因为它们不会继承。我需要的是类似于[parent methodA]的东西,它会在创建此ClassB对象的类中调用该方法,并让它在ClassA的特定实例上执行。

这样的事情存在吗?道歉,混乱的帖子,我不知道该搜索一个模糊的问题是什么。

2 个答案:

答案 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)来进行编译。