0

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

  1. 父类必须导入子类的标题,因此它可以添加该类的子视图。
  2. 子类必须导入父类的头文件,这样才能访问其方法和属性。它必须在其 .h 文件中而不是在其 .m 中进行导入,因为我需要将孩子的父级设为实例变量。
  3. 如果我这样做,我会遇到循环导入问题。

如果有人能理解这一点,你能帮忙解决这个问题吗?谢谢。

4

3 回答 3

2

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

有关更多信息,请参阅Objective-C:前向类声明

于 2013-01-10T01:36:15.687 回答
0

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

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

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

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

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

有关一般委托模式的更多信息,请在此处查看 Wikipedia:

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/

祝你好运!

于 2013-01-10T01:56:19.480 回答
0

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

例如:

@property(nonatomic,weak) id child;

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

于 2013-01-10T01:34:23.767 回答