【发布时间】:2012-01-13 11:54:57
【问题描述】:
这是一个相当复杂的继承层次结构,所以请耐心等待(我试图简化事情,而不是说明我正在使用的更复杂的确切情况):-
假设我创建了一个名为TextField 的UITextField 子类,这是我自己的自定义增强型通用文本字段。现在,为了提供这种增强的功能,在TextField 的init 方法中,我设置了super.delegate = self,以便将来自UITextField 的所有委托方法发送到TextField。 TextField 实现 UITextFieldDelegate 协议并接收这些委托方法来做一些有趣的事情。
然而,反过来,我想让TextField 拥有它的自己的 代表。所以我创建了一个名为TextFieldDelegate 的新协议(注意缺少UI-前缀!)并给TextField 一个具有相应属性的ivar id<TextFieldDelegate> __weak delegate,以便其他类可以从TextField 接收委托方法。
我希望你还在我身边,因为到目前为止我还没有做过任何太复杂的事情。但是假设现在,我创建了TextField 的另一个自定义子类,我们称之为PasswordTextField(在现实生活中,可能不需要创建子类来实现密码功能,但假设有一些相当复杂的实现需要这样做)。
我们还假设我想让PasswordTextField(就像TextField 有一个委托属性)能够发送一组增强的委托方法。例如,也许它可以发送一个方法passwordIsSecure,一旦密码达到所需的复杂程度就会发送该方法。现在,由于这种在常规 TextField 中找不到的行为,我创建了一个新协议:PasswordTextFieldDelegate <TextFieldDelegate>,它为 PasswordTextField 定义了新的委托方法 并且 继承了所有委托方法由TextField发送。
问题是:我如何在PasswordTextField 中实现这个?不起作用的事情:
继承
我不能简单地从TextField 继承委托,因为TextField 的委托只符合TextFieldDelegate 而不是PasswordTextFieldDelegate,所以我不能发送像[delegate passwordIsSecure] 这样的方法,因为TextFieldDelegate 没有这种方法。
覆盖 ivar
我可以尝试在PasswordTextField 中声明一个名为delegate 的ivar,但编译器抱怨这是一个重复的声明,因为当然在超类中已经有一个名为delegate 的ivar,所以这也不起作用*。
修改超类
我可以回到TextField 类并重新定义委托以实现TextFieldDelegate 和 PasswordTextFieldDelegate,但这看起来很混乱,并告诉TextField 它可以发送@987654357 @方法,当然不能!
我没有尝试过这个,只是因为它似乎打破了书中所有合理的编码规则。
总而言之,必须有某种方式来做到这一点,这样一个类的子类可以拥有它自己的委托,它是超类委托的子委托,并且所有这些都可以很好地结合在一起,但我只是可以'想不通!有什么想法吗?
(* 作为一个附带问题,我不明白为什么编译器在PasswordTextField 声明一个名为委托的“重复”ivar 时会抱怨,但是当TextField 声明一个名为委托的 ivar 时编译器不会抱怨,这可能是UITextField 的属性的副本称为委托!)
【问题讨论】:
-
可能我只是在黑暗中击中.. 但如果您只是将您的代表的@property 重新声明为 id
并拥有自己的合成器,这不会有帮助吗?我认为它会起作用。过段时间我会试一试
标签: iphone objective-c ios oop delegates