【问题标题】:Dismiss the Number Pad with a custom table view cell with TextField使用带有 TextField 的自定义表格视图单元格关闭数字键盘
【发布时间】:2015-11-04 01:05:01
【问题描述】:

我有一个带有自定义单元格和文本字段的表格视图。如下图。

自定义单元格的类:

import UIKit

protocol TextFieldTableDelegate{
    func retornaTexto(sender: TextFieldTableViewCell, texto: String)
}

class TextFieldTableViewCell: UITableViewCell, UITextFieldDelegate {

    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var label: UILabel!

    var delegate: TextFieldTableDelegate?

    override func awakeFromNib() {
        super.awakeFromNib()
        self.textField.delegate = self
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

    }

    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        self.delegate!.retornaTexto(self, texto: textField.text!)
        return true
    }

}

这个委托方法永远不会被调用

    func retornaTexto(sender: TextFieldTableViewCell, texto: String) {
        print(texto)
        codigoAreaSelecionada = texto
    }

问题是,在我触摸文本字段后,它会打开一个数字键盘,但是当我触摸它外部(在背景上)时,它不会关闭。

我试过这个Swift - How to dismiss number keyboard after tapping outside of the textfield,但它破坏了视图中的所有其他内容。

编辑:我让数字键盘键盘隐藏并显示将其添加到我的 viewController,但它不会触发委托方法。

var tapRecognizer : UITapGestureRecognizer?
func keyboardWillHide(notification: NSNotification) {

    view.removeGestureRecognizer(tapRecognizer!)
}
func keyboardWillShow(notification: NSNotification) {
    tapRecognizer = UITapGestureRecognizer(target: self, action: "didTapView")
    view.addGestureRecognizer(tapRecognizer!)
}

func didTapView(){
    self.view.endEditing(true)
}

编辑:

我改变了方法:

func textFieldShouldReturn(textField: UITextField) -> Bool {
   textField.resignFirstResponder()
   self.delegate!.retornaTexto(self, texto: textField.text!)
   return true
}

与: func textFieldDidEndEditing(textField: UITextField) {

    if let texto = textField.text{
        self.delegate!.retornaTexto(self, texto: texto)
    }
}

但它在调用 retornaTexto 时没有控制台警告就停止了。

【问题讨论】:

    标签: ios


    【解决方案1】:

    textFieldShouldReturn 在具有全键盘的 TextField 上点击 Return 键时被调用。数字小键盘没有返回键,所以这不适用于您的情况。

    可能正确的方法是将手势识别器添加到文本框之外的视图(可能是视图控制器的视图?)以关闭键盘(就像您引用的问题一样);但在键盘秀上这样做;并在键盘隐藏处将其删除。您可以为这些事件挂钩 UINotification 事件:请参阅How to detect when keyboard is shown and hidden

    您还可以使用这些事件来更改表格的表格插入,以便数字输入单元格在小型手机的键盘上方也可见!

    【讨论】:

    • 它可以工作,但是 func retornaTexto(sender: TextFieldTableViewCell, texto: String) 永远不会执行,所以我无法在我的委托上获取该字段的值
    【解决方案2】:

    也许你可以尝试另一种方法,修改UITableViewkeyboardDismissMode属性。

    这是在 iOS 7.0 中实现这一目标的最简洁方法。

    tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
    

    或在触摸时关闭

    tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
    

    更新

    我认为你可以实现这个关于编辑结束的委托方法。

    -(void)textFieldDidEndEditing:(UITextField *)textField  
    {
        // receive the end of editing of UITextField.
    }
    

    或者,通过以下方式获取编辑事件。

    // Add a "textFieldDidChange" notification method to the text field control.
    [textField addTarget:self 
                  action:@selector(textFieldDidChange:) 
        forControlEvents:UIControlEventEditingChanged];
    

    【讨论】:

    • 这种方式关闭键盘,但是我怎样才能触发 retornaTexto(sender: TextFieldTableViewCell, texto: String) 方法呢?
    • 我已经用 -(void)textFieldDidEndEditing:(UITextField *)textField 更改了 func textFieldShouldReturn(textField: UITextField) -> Bool {,但它在代理调用线路上停止工作。
    • stop working 是什么意思?如果它崩溃了,你可以添加关于All Exceptions 的断点来捕获错误。 Refer this page.
    猜你喜欢
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2013-06-01
    相关资源
    最近更新 更多