引用视图的父级而不进行循环导入

时间:2013-01-10 01:25:39

标签: objective-c

我有一个自定义的UIView类,需要知道它的父级(另一个不同的自定义UIView类)。

  1. 父类必须导入子类的标题,因此它可以添加该类的子视图。
  2. 子类必须导入父类的标头,因此它可以访问其方法和属性。它必须在.h文件而不是.m文件中进行导入,因为我需要让子节点的父节点成为实例变量。
  3. 如果我这样做,我会收到循环导入问题。
  4. 如果有人能够理解这一点,你能帮忙解决这个问题吗?感谢。

3 个答案:

答案 0 :(得分:2)

您想要的通常称为前瞻声明。

有关详细信息,请参阅Objective-C: Forward Class Declaration

答案 1 :(得分:0)

有很多方法可以解决这个问题,例如通过将对另一个类的引用声明为id,并向其发送消息(在Objective-C中,您甚至不需要转换它们,编译器不会抱怨这个)。

例如:

@property(nonatomic,weak) id child;

但是,您可以通过使用处理这两个类的根控制器的方式来检查您的设计。这种方式A不直接与B对话而B不直接与A对话。相反,如果A想与B说话,则用C说话,C与B说话,反之亦然。

答案 2 :(得分:0)

虽然可以使用前向声明(@class ParentClass)以及对子项头文件中父(@property (nonatomic, weak) ParentClass *parent)的弱引用,但这通常是不是良好的编程习惯。

这通常不是一个好主意的原因:

1)随着项目变得越来越大,你可能会违反DRY(“不要重复自己”)因为孩子需要某个班级的父母...如果另一个家长后来需要创建同一个子对象?您必须创建一个新类,声明新父级的另一个前向类,并且具有弱属性。​​

2)这也可能导致意大利面条代码......如果你想为父母添加一个影响孩子正在使用的方法的新功能怎么办?你是否创造了一种略有不同的新方法(见第1点关于违反DRY的内容)?你是否为原始方法创建了一个输入(你还必须确保孩子现在知道这个变化并传递适当的输入。)

相反,委托设计模式在这里效果更好。 Apple也经常在他们的图书馆中使用它。在示例中,UITableView声明委托和数据源,以便它可以将操作(单元格的点击)和数据输入(创建自定义单元格)委托给其他拥有的类,而UITableView对象不必知道关于所述父类的实现。

有关委派模式的更多信息,请参阅维基百科:

http://en.wikipedia.org/wiki/Delegation_pattern

有关创建自己的protocols的教程(如何在iOS中实现委派),请参阅此教程:

http://mobile.tutsplus.com/tutorials/iphone/ios-sdk-custom-delegates/

对于iOS上的高质量教程和介绍,包括委托和其他必要的iOS概念,请参阅Ray Wenderlich的网站:

http://www.raywenderlich.com/

祝你好运!