gpt4 book ai didi

iphone - Objective-C——子类中委托(delegate)的子类

转载 作者:可可西里 更新时间:2023-11-01 05:47:16 24 4
gpt4 key购买 nike

这是一个相当复杂的继承层次结构,所以请耐心等待(我试图简化事情,而不是陈述我正在使用的确切情况,后者更复杂):-

假设我创建了 UITextField 的子类称为 TextField这是我自己定制的增强型通用文本字段。现在,为了提供这种增强功能,在 init TextField的方法| ,我设置了super.delegate = self这样来自 UITextField 的所有委托(delegate)方法发送至TextField . TextField实现 UITextFieldDelegate协议(protocol)并接收这些委托(delegate)方法来做一些有趣的事情。

但是,反过来,我想让它成为TextField有它的自己的委托(delegate)。所以我创建了一个名为 TextFieldDelegate 的新协议(protocol)(注意缺少 UI -前缀!)并给出 TextField伊娃id<TextFieldDelegate> __weak delegate具有相应的属性,以便其他类可以从 TextField 接收委托(delegate)方法.

我希望你仍然支持我,因为到目前为止我还没有做过任何太复杂的事情。但是现在,我创建了 TextField 的另一个自定义子类。 ,我们称它为PasswordTextField (在现实生活中,人们可能不需要创建子类来实现密码功能,但我们假设有一些相当复杂的实现需要这样做)。

我们还假设我想做到 PasswordTextField (类似于 TextField 具有委托(delegate)属性)能够发送一组增强的委托(delegate)方法。例如,也许它可以发送一个方法 passwordIsSecure一旦密码达到所需的复杂程度,就会发送该密码。现在,由于在常规 TextField 中找不到这种行为,我创建了一个新协议(protocol):PasswordTextFieldDelegate <TextFieldDelegate>它为 PasswordTextField 定义了新的委托(delegate)方法and 继承了 TextField 发送的所有委托(delegate)方法.

问题是:我如何在 PasswordTextField 中实现它? ?不起作用的东西:

继承

我不能简单地从 TextField 继承委托(delegate),因为 TextField的委托(delegate)只符合 TextFieldDelegate而不是 PasswordTextFieldDelegate , 所以我不能发送类似 [delegate passwordIsSecure] 的方法因为TextFieldDelegate没有这样的方法。

覆盖ivar

我可以尝试在 PasswordTextField 中声明一个 ivar称为委托(delegate),但编译器会提示这是一个重复的声明,因为当然在父类(super class)中已经有一个称为委托(delegate)的 ivar,所以这也不起作用*。

修改父类(super class)

我可以回到 TextField类并重新定义委托(delegate)以同时实现 TextFieldDelegate PasswordTextFieldDelegate , 但这看起来很乱并告诉 TextField它可以发送 PasswordTextFieldDelegate方法,当然,它不能!

我还没有尝试过这个,只是因为它似乎打破了书中所有合理的编码规则。

总而言之,必须有一些方法可以做到这一点,这样一个类的子类就可以拥有自己的委托(delegate),它是父类(super class)委托(delegate)的子委托(delegate),并且所有这些都可以很好地组合在一起,但我就是不能'想不通!有什么想法吗?

(* 作为附带问题,我不明白为什么编译器会在 PasswordTextField 声明一个名为 delegate 的“重复”ivar 时提示,但在 TextField 声明一个名为 delegate 的 ivar 时却不提示,这大概是一个UITextField 的名为 delegate 的属性的副本!)

最佳答案

UITextField 委托(delegate) ivar 被命名为 _delegate,而不是委托(delegate)。因此,为什么您可以在 TextField 中再次声明它,而不是在 PasswordTextField 中。

至于你的委托(delegate)继承问题。我不确定 ObjectiveC 是否支持您想要的。

您可能只需要键入您的委托(delegate)“id”,而不是“id ”。然后您可以重写 setDelegate 并确保委托(delegate)在 conformsToProtocol 中传递。但是,您将在此处丢失编译时检查,而只有 conformsToProtocol 的运行时检查

关于iphone - Objective-C——子类中委托(delegate)的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8850182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com