gpt4 book ai didi

ios - 调用 resignFirstResponder 在覆盖 firstResponder 中不起作用

转载 作者:搜寻专家 更新时间:2023-11-01 05:57:42 25 4
gpt4 key购买 nike

如何使用 UIResponder 聚焦激活的 UITextField?

代码如下:

//  customTextField.swift
import UIKit
class customTextField: UITextField {

override func becomeFirstResponder() -> Bool {
if self.tag == 1 {
self.borderStyle = .Line
self.superview?.viewWithTag(2)?.resignFirstResponder()
self.superview?.viewWithTag(3)?.resignFirstResponder()
} else if self.tag == 2 {
self.borderStyle = .Line
self.superview?.viewWithTag(1)?.resignFirstResponder()
self.superview?.viewWithTag(3)?.resignFirstResponder()
} else {
self.borderStyle = .Line
self.superview?.viewWithTag(1)?.resignFirstResponder()
self.superview?.viewWithTag(2)?.resignFirstResponder()
}
return true
}
override func resignFirstResponder() -> Bool {
print("This is called")
self.borderStyle = .None
super.resignFirstResponder()
return true
}}

我想通过 View 的标签检查哪个文本字段是 firstResponder。然后如果 resignFirstResponder 应该取消其他 TextField 的焦点。

但是,当我触摸 View 中的文本字段时,becomefirstResponder 的代码块中的 resignFirstResponder 甚至都没有被调用。

最佳答案

不要破坏父类(super class):传递消息

在覆盖系统消息的过程中,比如becomeFirstResponder,你可能会不经意地禁用父类。最安全的无操作 becomeFirstResponder 是这样的:

override func becomeFirstResponder() -> Bool {
return super.becomeFirstResponder()
}

省略 super.becomeFirstResponder() 将损害 UITextField

也让原始逻辑(何时成为或不成为响应者)顺其自然。总是响应 truefalse 会改变父类的行为,这可能会产生不需要的和不幸的副作用。

    override func becomeFirstResponder() -> Bool {
let becomeFirstResponder = super.becomeFirstResponder()
// Do stuff
return becomeFirstResponder
}

不要复制操作系统

无需跟踪当前响应者。
让操作系统告诉您谁是响应者:如果屏幕键盘在没有点击新字段的情况下被关闭,并且注定会中断,则尝试进行跟踪可能实际上不起作用。相反,以相同的方式收听 resignFirstResponder:

override func resignFirstResponder() -> Bool {
return super.resignFirstResponder()
}

更少的代码,更多的灵 active

将两个规则放在一起,并使用 .RoundedRect.Line 进行显式重绘(.None 无效),您的整个CustomTextField 可能如下所示:

class CustomTextField: UITextField {

override func becomeFirstResponder() -> Bool {
let becomeFirstResponder = super.becomeFirstResponder()
if becomeFirstResponder {
self.borderStyle = .line
}
return becomeFirstResponder
}

override func resignFirstResponder() -> Bool {
let resignFirstResponder = super.resignFirstResponder()
if resignFirstResponder {
self.borderStyle = .roundedRect
}
return resignFirstResponder
}
}

请注意,如果 super.becomeFirstResponder()super.resignFirstResponder() 没有成功,不会采取任何行动


演示

Animation


► 在 GitHub 上找到此解决方案以及有关 Swift Recipes 的更多详细信息.

关于ios - 调用 resignFirstResponder 在覆盖 firstResponder 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34985404/

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