我在使用UITextfield
s的插入符号时遇到了问题。
每当我点击文本字段时,插入符号都不显示,但文本字段正常工作。问题类似于here描述的问题(已经尝试过在那里编写的解决方案)。
我注意到每当我加载一个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()
您可以在自定义响应程序中覆盖此方法以更新对象的状态或执行某些操作,例如突出显示选择。如果您覆盖此方法,您必须在实施中的某个时刻调用超级。
所以我需要打电话给超级猜测。
答案 0 :(得分:0)
好吧,我通过覆盖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
,所以这可能不是最有效的方法(如果改变文本字段是一个沉重的操作)。