检测 UITextField 的焦点变化

Posted

技术标签:

【中文标题】检测 UITextField 的焦点变化【英文标题】:Detect Focus Change for UITextField 【发布时间】:2012-05-27 03:41:08 【问题描述】:

我正在尝试将动画设置为在键盘隐藏并出现在文本字段时向上移动,并且我让它工作得非常好,但是当焦点从一个文本字段移动到另一个文本字段时,它不会由于键盘已显示,因此无法正常工作。

在 viewDidLoad 中,我注册了以下内容:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];

然后在keyboardWillShow 和keyboardWillHide 方法中,它确定视图是否应该移动并相应地动画。但是,如果键盘已经显示并且用户单击需要视图向上移动的另一个文本字段,则不会调用该方法。当键盘已经显示时,有什么方法可以检测焦点是否已更改为另一个文本字段?如果有一种方法可以做到这一点而不必将所有文本字段设置为委托,那就太好了。

提前致谢。

【问题讨论】:

【参考方案1】:

使用UITextField 委托方法.. 它比键盘方法更适合您的情况.. 当 textField 获得焦点时,- (void)textFieldDidBeginEditing:(UITextField *)textField; 将被触发.. 当它失去焦点时,- (void)textFieldDidEndEditing:(UITextField *)textField; 将被触发。

【讨论】:

感谢您的回复。如果我这样做,有没有办法获取用户信息?因为在这些方法中,我从 userInfo 获得了 UIKeyboardAnimationDurationUserInfoKey 和 UIKeyboardFrameEndUserInfoKey 来设置动画,但我不确定当没有通知作为参数传入时我该如何做? UIKeyboardAnimationDurationUserInfoKey,用于键盘动画持续时间(因此视图移动的动画可以匹配),UIKeyboardFrameEndUserInfoKey 用于获取键盘的高度。我不想硬编码这些值。 由于动画持续时间和键盘高度是静态变量,您可以读取一次并将其存储在NSUSerDefaults 中,以便以后在任何地方使用它们。 是的,我应该这样做.. 我只是觉得懒惰,想看看是否有更简单的方法可以在焦点更改到另一个文本字段时获得通知。还是谢谢!【参考方案2】:
-(BOOL)textFieldShouldBeginEditing:(UITextField*)textField 
if (textField.tag == 1)  //first textField tag
    //textField 1

else 
   //textField 2


【讨论】:

【参考方案3】:

使用 UITextFieldDelegate

func textFieldDidBeginEditing(textField: UITextField) 
        println("did")
        if textField.tag == 1
            self.txtFullName.layer.borderColor = UIColor.blueColor().CGColor
        
    

【讨论】:

其实是func textFieldDidBeginEditing(_ textField: UITextField) 函数签名【参考方案4】:

在 Swift 4 中:

    UITextFieldDelegate 实现到您的ViewController 类中 为您要检测焦点的 textFields 添加 Outlets 实现函数textFieldDidBeginEditing(如果您想收到有关该特定操作的通知,请参阅Apple's documentation)并填写您的代码 在 viewDidLoad() 上,将您的 ViewController 类指定为您之前在步骤 2 中添加的 textField 的代表

它必须类似于:

class ViewController: UIViewController, UITextFieldDelegate 
    @IBOutlet weak var yourTextField: UITextField!

    func textFieldDidBeginEditing(_ textField: UITextField) 
        // Your code here
    

    override func viewDidLoad() 
        super.viewDidLoad()
        yourTextField.delegate = self
    

    ...


【讨论】:

验证通过 它应该有一个标志,大多数时候你可以有几个,并想检查一个是否集中。

以上是关于检测 UITextField 的焦点变化的主要内容,如果未能解决你的问题,请参考以下文章

检测UITextField的焦点更改

检测uitextfied中的文本变化?

UITextField 失去焦点事件

如何永久地显示从UITextField输入的数据到标签?

如何从 UITextField 中移除焦点?

成为FirstResponder 和多个 UITextField 焦点