使用带有 TextField 的自定义表格视图单元格关闭数字键盘

Posted

技术标签:

【中文标题】使用带有 TextField 的自定义表格视图单元格关闭数字键盘【英文标题】:Dismiss the Number Pad with a custom table view cell with 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 时没有控制台警告就停止了。

【问题讨论】:

【参考方案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.

以上是关于使用带有 TextField 的自定义表格视图单元格关闭数字键盘的主要内容,如果未能解决你的问题,请参考以下文章

带有 TextField 和第一响应者的自定义 UITableViewCell

带有核心图形的自定义表格视图单元

从自定义单元格 iPhone 中的 textField 获取值

TextField 子视图未通过 UITableViewCell 框架大小更改调整大小

如何为 MkAnnotation View 自定义视图,就像表格视图的自定义单元格一样?

带有故事板的自定义静态 TableView - 单元格背景