UITextField 移动时出错

Posted

技术标签:

【中文标题】UITextField 移动时出错【英文标题】:Error with UITextField moving 【发布时间】:2016-01-01 00:34:33 【问题描述】:

我正在尝试在我的应用程序中设计一个视图,当 UITextField 中的文本与某个正则表达式不匹配时,该视图会显示错误 UILabel。一切正常,除非我的UITextField 包含无效条目,然后我点击屏幕关闭键盘。键盘关闭后,UITextField 移动到我的UITextView(红色文本)之上,我不知道为什么。我在我的代码中设置了断点,但似乎我的代码在键盘关闭后都没有执行。任何帮助表示赞赏。

//
//  ViewController.swift
//  KeyboardLabel
//

import UIKit

class ViewController: UIViewController 

    @IBOutlet var titleLabel:UILabel!
    @IBOutlet var errorLabel:UITextView!
    @IBOutlet var textBox:UITextField!
    @IBOutlet var createButton:UIButton!

    var deltaHeight:CGFloat!
    var beenMoved = true

    override func viewDidLoad() 
        super.viewDidLoad()

        // Register for notifications when the text in the text field is changed
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "validateText", name: UITextFieldTextDidChangeNotification, object: textBox)

        // Add a gesture recognizer to dismiss the keyboard
        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "dismissKeyboard"))

        // Set the text of the labels
        titleLabel.text = "Container Number:"
        errorLabel.text = "Error, Invalid container number.\nRe-enter number."

        // Calculate the height to move the text field and button
        deltaHeight = errorLabel.frame.size.height + 8.0
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    func dismissKeyboard() 
        textBox.resignFirstResponder()
    

    func validateText() 
        dispatch_async(dispatch_get_main_queue(), 
            // Regular expression for determining whether the text is valid
            let predicate  = NSPredicate(format: "SELF MATCHES %@", "[a-zA-Z0-9#]+")
            let empty = self.textBox.text!.isEmpty
            let valid = predicate.evaluateWithObject(self.textBox.text)

            // If the string is valid
            if valid || empty 
                // If the view has been moved down
                if(!self.beenMoved) 
                    // Hide the error label then move the text field and create button up
                    self.errorLabel.hidden = true
                    UIView.animateWithDuration(0.4, animations: 
                        self.textBox.frame.origin.y -= self.deltaHeight
                        self.createButton.frame.origin.y -= self.deltaHeight
                    )

                    // Flip the flag
                    self.beenMoved = true
                
            
                // If the string is invalid
            else 
                // If the view has been moved up
                if(self.beenMoved) 
                    // Show the error label then move the text field and create button down
                    UIView.animateWithDuration(0.4, animations: 
                        self.textBox.frame.origin.y += self.deltaHeight
                        self.createButton.frame.origin.y += self.deltaHeight
                        , completion: 
                            (flag:Bool) in
                            self.errorLabel.hidden = false
                    )

                    // Flip the flag
                    self.beenMoved = false
                
            

            // If the text field is empty
            if empty 
                // Disable the create button
                self.createButton.enabled = false
            
            else 
                // Enable the create button
                self.createButton.enabled = true
            
        )
    

【问题讨论】:

我怀疑您因为自动布局而遇到麻烦。使用自动布局时,您不应该更改视图的框架。您应该创建@IBOutlets 来约束定位视图,并更新代码中的constant 属性以重新定位视图。 @vacawama 谢谢。我通过创建@IBOutlets 解决了这个问题,控制errorLabel 的高度和textBox 的顶部间距。 【参考方案1】:

这种行为实际上是这样的,如果您输入的内容与正则表达式不匹配,则 UITextField 最初会移动到 UITextView 的顶部。这是因为您正在使用以下代码行移动 UITextField 和按钮:

   self.textBox.frame.origin.y += self.deltaHeight
   self.createButton.frame.origin.y += self.deltaHeight

当键盘关闭时,UITextField 和 UIButton 会返回到它们的原始位置。我假设您对 UI 元素没有任何限制。

【讨论】:

以上是关于UITextField 移动时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 swift 3 UITextField 边框颜色?

UITextField 中的文本将无法正确居中

点击 UITextField 不起作用

成为FirstResponder 和多个 UITextField 焦点

如何更好地限制一个UITextField的输入长度

比较 UITextField 的文本和字符串时 if 语句出错