这是一个相当复杂的继承层次结构,所以请耐心等待(我试图简化一些事情,而不是说明我正在使用的确切情况,这更加复杂): -Objective-C - 子类代理子类
假设我创建了一个UITextField
的子类,名为TextField
,这是我自己定制的增强型通用文本字段。现在,为了提供这种增强的功能,在init
方法TextField
中,我设置了super.delegate = self
,使得来自UITextField
的所有代理方法都被发送到TextField
。 TextField
实现UITextFieldDelegate
协议并接收这些委托方法来做一些有趣的事情。
但是,反过来,我想让TextField
拥有自己的委托。因此,我创建了一个名为TextFieldDelegate
的新协议(注意缺少UI
-prefix!),并给予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
没有这样的方法。
重写伊娃
我可以尝试声明中PasswordTextField
伊娃称为委托,但是编译器会抱怨,这是一个重复的声明,自然是因为已经有所谓的代表在超伊娃,所以这不工作*。
修改超
我能回到TextField
类,并重新委托同时实现TextFieldDelegate
和PasswordTextFieldDelegate
,但这似乎凌乱,并告诉TextField
,它可以发送PasswordTextFieldDelegate
方法,其中当然,它不能!
我没有试过这个,只是因为它似乎打破了书中每一个明智的编码规则。
总之,这样做必须有一些方法,这样一个类的子类可以拥有它自己的委托,它是超类委托的子委托,并且所有这些都可以很好地配合在一起,但是我可以不知道!有任何想法吗?
(*作为一个方面的问题,我不明白为什么编译器会抱怨当PasswordTextField
声明了一个“重复”伊娃命名的委托,但是当TextField
声明伊娃命名委托这大概是的UITextField
重复不抱怨的财产叫代表!)
可能只是打在黑暗中..但不会有帮助,如果你只是重新声明你的委托的@属性为ID,并有自己的综合?我认为它会奏效。 mebbe生病后试一试 –
govi
2012-01-13 14:02:48