使用带有 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】:也许你可以尝试另一种方法,修改UITableView
的keyboardDismissMode
属性。
这是在 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 框架大小更改调整大小