[英]The caret disappears or won't show up in UITextField
我在UITextfield
的插入符号方面遇到了麻烦。
每当我点击文本框时,插入记号都不会显示,否则文本框将正常工作。 该问题类似于此处描述的问题(也已经尝试过在此处编写的解决方案)。
我注意到,每当我加载一个视图控制器并点击一个文本字段(或以编程方式使其成为第一响应者)时,它的确显示插入符号,但是当我点击另一个文本字段或使一个文本字段退出其第一响应者状态时, 任何文本字段都不会显示其插入符号。 插入符号了 (除非我返回并再次重新加载ViewController)。
对于为什么发生这种情况一无所知。 我在整个应用程序中使用自定义字体。 但是我不确定那是否是使插入符号消失的原因,因为我之前使用过自定义字体没有任何问题。
编辑:
我认为我至少已经找到了为什么会出现问题。 这与我覆盖成为becomeFirstResponder
和resignFirstResponder
。
我的代码如下:
extension UITextField {
open override func becomeFirstResponder() -> Bool {
let willBecomeResponder = super.becomeFirstResponder()
if willBecomeResponder {
backgroundColor = .red
layer.borderColor = .blue
}
return willBecomeResponder
}
open override func resignFirstResponder() -> Bool {
let willResignResponder = super.resignFirstResponder()
if willResignResponder {
backgroundColor = .blue
layer.borderColor = .red
}
return willResignResponder
}
}
覆盖扩展名中的这些方法会使插入符号消失。
我认为这种情况最有可能发生,因为UITextField
本身在这些方法的实现中做了一些“插入式管理”。 之所以如此,是因为即使return super.becomeFirstResponder()
并且重写方法中没有自定义代码也会使插入符号消失。
UITextField
子类的情况下解决此问题? 显然,调用super
只会调用UIResponder
的实现,但是文档特别提到:
becomeFirstResponder()
您可以在自定义响应器中重写此方法以更新对象的状态或执行某些操作,例如突出显示所选内容。 如果重写此方法,则必须在实现中的某个时刻调用super 。
所以我想称呼超级。
好了,我通过重写isFirstResponder
并在那里基于super.isFirstResponder
更改文本字段解决了我的问题。
看起来像:
open override var isFirstResponder: Bool {
get {
let responder = super.isFirstResponder
backgroundColor = (responder) ? .red : .blue
layer.borderColor = (responder) ? .blue : .red
return responder
}
}
我确实注意到有很多呼叫发送给isFirstResponder
,所以这也许不是最有效的方法(如果更改文本字段是一项繁重的操作)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.