UITextField 子类 - 订阅事件

Posted

技术标签:

【中文标题】UITextField 子类 - 订阅事件【英文标题】:UITextField subclass - subscribing to events 【发布时间】:2015-05-25 15:52:54 【问题描述】:

我创建了一个 UITextField 的子类,它有自己的视觉风格和功能。该功能是将用户限制为十进制货币值(例如,3.50),但这并不真正相关,因为我知道我拥有的算法有效。问题是我想在文本字段子类本身中包含该逻辑。到目前为止,我已经成功捕获了 textFieldDidBeginEditing 和 textFieldDidEndEditing 的委托等效项:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBeginEditing", name: UITextFieldTextDidBeginEditingNotification, object: self)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "didEndEditing", name: UITextFieldTextDidEndEditingNotification, object: self)

运作良好。现在我需要一种方法来检查用户是否输入了有效的输入并仅在该字符有效时才更新其文本(如 shouldChangeCharactersInRange,但没有委托),但我需要在该文本字段子类本身中执行此操作。否则,我只是在每个具有此类字段的视图控制器中重复 40 行代码。

【问题讨论】:

【参考方案1】:

到目前为止,我已经成功捕获了 textFieldDidBeginEditing 和 textFieldDidEndEditing 的委托等价物

但是你走错了路。不要使用通知;没必要。

只需让 UITextField 子类使 self 成为 self 的代表!

self.delegate = self

现在所有UITextFieldDelegate methods 都将到达 UITextField 子类本身。在子类中实现任何你感兴趣的方法,然后你就完成了。

但是,这种方法有一个缺点:您“窃取”了文本字段的委托,并且不能轻易地将其他对象设为委托。所以这里有另一种方法:将 UITextField 子类设置为其自己的Editing Changed 事件的目标。这样做的好处是它不会阻止 other 对象成为目标,因为 UIControl 事件可以发送到多个目标。

(当然,我想你可以改用UITextFieldTextDidChangeNotification。)

【讨论】:

嗯,是的,我一开始就是这样做的,但后来我阅读了一些关于该主题的***问题,有些人说它不整洁,可能会导致问题,至少不是委托的预期用途。当然我现在找不到这些答案,但是将一个类的委托设置为它自己完全可以吗? 绝对。 Cocoa 不在乎代表是谁。试试看! 问题是每当我确实需要使用视图控制器作为委托时,我必须覆盖现有的 self 委托,这会删除该字段的所有独特功能,除非我重新编码视图控制器。有没有办法解决这个问题? 修改了我的答案以包含更多可能性。或者,如果最坏的情况发生最坏的情况,您可以进入 消息转发... @skypecakes 这是我书中的一个例子:github.com/mattneub/Programming-ios-Book-Examples/blob/master/…

以上是关于UITextField 子类 - 订阅事件的主要内容,如果未能解决你的问题,请参考以下文章

UITextField 在 iOS 7.1 上没有响应

如何在 UITextField 子类中拦截来自键盘的文本输入事件

UITextField 的子类

以编程方式创建 UITextField 事件

将 UITextField 添加到 UITableViewCell

占位符右对齐的 UITextField 不能正确向右移动