【问题标题】:Dismiss UITextField decimal pad keyboard in UIScrollView在 UIScrollView 中关闭 UITextField 十进制键盘
【发布时间】:2016-01-23 22:54:56
【问题描述】:

我正在寻找解决问题的方法,但我找到的所有建议都不起作用。

我从一个基于两个带小数点的TextField 的工作解决方案开始。考虑到我没有返回键,在任何地方点击时关闭键盘,我使用成功:

view.endEditing(true)

当我决定添加 UIScrollView 以便在屏幕底部向上移动 UITextField 时,我的问题会出现。

view.endEditing(true) 不起作用,因为滚动视图覆盖了视图。我添加了一个TapGestureRecognizer,除了键盘关闭之外一切正常。

如果我在activeTextFiled 上使用resignFirstResponder,则在TapGestureReconizer 函数下,应用程序崩溃将转到AppDelegate 并出现错误:

线程 1:信号 SIGABRT。

class ViewController: UIViewController, UITextFieldDelegate {

    var activeField: UITextField?

    @IBOutlet weak var textFieldTop: UITextField!
    @IBOutlet weak var textFieldBottom: UITextField!
    @IBOutlet weak var scrollView: UIScrollView!

    func textFieldDidBeginEditing(textField: UITextField) {
        activeField = textField
    }

    func textFieldDidEndEditing(textField: UITextField) {
        activeField = nil
    } 

    func registerForKeyboardNotifications() {
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden", name: UIKeyboardWillHideNotification, object: nil)
    }

    func deregisterFromKeyBoardNotification() {
        NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
    }

    func keyboardWasShown(notification: NSNotification) {
        self.scrollView.scrollEnabled = true
        let info : NSDictionary = notification.userInfo!
        let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size
        let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height + 20, 0.0)

        self.scrollView.contentInset = contentInsets
        self.scrollView.scrollIndicatorInsets = contentInsets

        var aRect : CGRect = self.view.frame
        aRect.size.height -= keyboardSize!.height
        if let _ = activeField
        {
            if (!CGRectContainsPoint(aRect, activeField!.frame.origin))
            {
                self.scrollView.scrollRectToVisible(activeField!.frame, animated: true)
            }
        }
        self.scrollView.scrollEnabled = false
    }

    func keyboardWillBeHidden(notification: NSNotification)
    {
        let info : NSDictionary = notification.userInfo!
        let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size
        let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, -keyboardSize!.height, 0.0)
        self.scrollView.contentInset = contentInsets
        self.scrollView.scrollIndicatorInsets = contentInsets
        self.scrollView.scrollEnabled = false
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        registerForKeyboardNotifications()
        self.textFieldBottom.delegate = self
        self.textFieldTop.delegate = self

        scrollView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "closeKeyboard"))

    }

    func closeKeyboard() {
        activeField?.resignFirstResponder()

    }
}

我尝试了不同的解决方案,但都没有奏效。

【问题讨论】:

    标签: ios uiscrollview keyboard uitextfield dismiss


    【解决方案1】:

    我仍在寻找代码/故事板中的一些委托或其他可能缺失的部分,但我花了额外的时间检查我发现了问题。

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)
    

    我在原始代码中忘记了“keyboardWillBeHidden:”末尾的“:”。 这是抛出异常,因为这个函数有一个参数。

    现在一切正常

    【讨论】:

      猜你喜欢
      • 2014-10-10
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2017-06-25
      相关资源
      最近更新 更多