【问题标题】:Detect Focus Change for UITextField检测 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 方法中,它确定视图是否应该移动并相应地动画。但是,如果键盘已经显示并且用户单击需要视图向上移动的另一个文本字段,则不会调用该方法。当键盘已经显示时,有什么方法可以检测焦点是否已更改为另一个文本字段?如果有一种方法可以做到这一点而不必将所有文本字段设置为委托,那就太好了。

提前致谢。

【问题讨论】:

    标签: iphone ios ios5 uitextfield xcode4.3


    【解决方案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 中:

      1. UITextFieldDelegate 实现到您的ViewController 类中
      2. 为您要检测焦点的 textFields 添加 Outlets
      3. 实现函数textFieldDidBeginEditing(如果您想收到有关该特定操作的通知,请参阅Apple's documentation)并填写您的代码
      4. 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
          }
      
          ...
      
      }
      

      【讨论】:

      • 验证通过
      • 它应该有一个标志,大多数时候你可以有几个,并想检查一个是否集中。
      猜你喜欢
      • 2011-09-16
      • 2013-02-07
      • 1970-01-01
      • 2010-11-12
      • 2013-02-24
      • 2022-09-23
      • 1970-01-01
      • 2010-11-04
      • 2013-05-03
      相关资源
      最近更新 更多