UITextField键盘没有消失

时间:2015-04-29 06:42:39

标签: ios swift uitextfield

我有一个UIViewController,其中包含UITextField,当我点击或视图被取消时,我试图解除键盘。但是,当我拨打resignFirstResponder()时,键盘仍然没有被解雇,我不太清楚为什么。这是我的代码:

class MessageViewController: UIViewController, UITextFieldDelegate {
    var messageTextField : UITextField = UITextField()

    override func viewDidLoad() {
        ...
        messageTextField.frame = CGRectMake(10, UIScreen.mainScreen().bounds.size.height-50, UIScreen.mainScreen().bounds.size.width-80, 40)
    messageTextField.delegate = self
    messageTextField.borderStyle = UITextBorderStyle.Line
    messageTextField.becomeFirstResponder()
    self.view.addSubview(messageTextField)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
        ...
    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        self.view.endEditing(true)
        println("Touched")
    }

    func keyboardWillShow(notification: NSNotification) {
        var keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey]as? NSValue)?.CGRectValue()
        let messageFrame = messageTextField.frame
        let newY = messageFrame.origin.y - keyboardSize!.height
        messageTextField.frame = CGRectMake(messageFrame.origin.x, newY, messageFrame.size.width, messageFrame.size.height)
    }

    func keyboardWillHide(notification: NSNotification) {
        var keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey]as? NSValue)?.CGRectValue()
        let messageFrame = messageTextField.frame
        let newY = messageFrame.origin.y - keyboardSize!.height
        messageTextField.frame = CGRectMake(messageFrame.origin.x, newY, messageFrame.size.width, messageFrame.size.height)
    }

}

有谁知道为什么键盘不能解雇?我以编程方式将UITextField添加到视图中,而不是使用storyboard。这有什么不同吗?

5 个答案:

答案 0 :(得分:2)

arr

确认协议

 class ViewController: UIViewController,UITextFieldDelegate {

设置委托

messageTextField.delegate=self

使用此代码..

答案 1 :(得分:1)

以下是我为该问题所做的工作。我希望这种方法能解决你的问题。

文本字段

@IBOutlet var userID : UITextField!

功能

func textFieldShouldReturn(textField: UITextField!)-> Bool
{   userID.resignFirstResponder( )
    return true
}

在您想要的功能中,您需要编写此语法。

@IBAction func login(sender: AnyObject)
{
    userID.resignFirstResponder( )
}

这是在ViewDidLoad或ViewDidAppear

override func viewDidLoad( )
{
    userID.delegate = self;
}

我无法对之前的用户发表评论。这就是我写这个的原因。 我希望这会给你一些想法。

答案 2 :(得分:0)

func textFieldShouldReturn(textField: UITextField) -> Bool {
   self.view.endEditing(true)
   //textField.resignFirstResponder()
   return false
}

检查delegate添加到您的viewDidLoad()

self.yourTextField.delegate = self;

how-to-dismiss-uitextfields-keyboard-in-your-swift-app

这可能对您有所帮助:)。

答案 3 :(得分:0)

@ vijeesh的答案可能会有效,逻辑几乎是正确的,但如果你使用多个UITextField,那在技术上是错误的。 textField是调用textFieldShouldReturn时传递的UITextField参数。问题是,你只是声明:

textField.resignFirstResponder()

您的程序并不知道您所指的UITextField。即使您的程序中只有一个textField,并且您知道它是您的messageTextField,程序仍然不知道。它只是看到&#34; textField&#34;。因此,您必须告诉它如何为程序中的每个UITextField执行操作。即使你只有一个。这应该有效:

func textFieldShouldReturn(textField: UITextField) -> Bool {
    if textField == messageTextField {
        messageTextField.resignFirstResponder()
    }
    return true
}

答案 4 :(得分:0)

很简单。 首先添加Tap Gesture

func handle(tap: UITapGestureRecognizer){
view.endEditing(true)
}
函数句柄中的

User

因此,当您单击UITextField外部时,您可以关闭键盘