将文本输入到包含 UITextFields 的 UITableView 单元格时的键盘控制
Posted
技术标签:
【中文标题】将文本输入到包含 UITextFields 的 UITableView 单元格时的键盘控制【英文标题】:Control of keyboard when entering text into UITableView cells containing UITextFields 【发布时间】:2018-12-08 23:05:54 【问题描述】:我有一个带有自定义单元格的 UITableView,其中包含两个用于文本输入的 UITextField。我希望键盘保持原位,直到文本输入完成,但是当第二个 textField 被点击时,键盘会消失,我必须再次点击才能将其取回。我知道第一次点击触发了“resignFirstResponder”消息,但我怎样才能将键盘保持在原位?已经尝试设置tableScrollView 的keyboardDissmissMode,但没有任何区别。我实现了“textFieldDidEndEditing”来存储输入的文本并将视图控制器声明为 texField 的委托。我在 ios 12 中使用 Swift 4。
这是自定义单元格的代码:
类 ChoreoCell: UITableViewCell, UITextFieldDelegate var inputText:String?
@IBOutlet weak var countText: UITextField!
didSet
countText.sizeToFit()
countText.text = inputText
@IBOutlet weak var stepText: UITextField!
didSet
stepText.sizeToFit()
stepText.text = inputText
...这是我在 tableViewController 中使用的代码:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell( withIdentifier:Storyboard.CellIdentifier, for: indexPath) as? ChoreoCell
if (self.choreography.count == 0 )
let myCountSteps = CountSteps(counts:"", steps:"" )
for _ in 0...Storyboard.InitialRows-1
self.choreography.append(myCountSteps)
cell!.countText.text = self.choreography[indexPath.row].counts
cell!.stepText.text = self.choreography[indexPath.row].steps
cell!.countText.delegate = self
cell!.stepText.delegate = self
return cell!
func textFieldDidEndEditing(_ textField: UITextField)
guard let txt : String = textField.text else
print ("input error for text, editing ended but no text received")
return
var v:UIView = textField
repeat v = v.superview! while !(v is UITableViewCell)
if let cell = v as? ChoreoCell
guard let ip = self.tableView.indexPath(for: cell) else
print("Error identifying index path for \(cell)")
return
switch (textField)
case cell.countText:
let myCountSteps = CountSteps(counts:txt, steps:cell.stepText.text! )
self.choreography[ip.row] = myCountSteps
case cell.stepText:
let myCountSteps = CountSteps(counts:cell.countText.text!, steps:txt )
self.choreography[ip.row] = myCountSteps
default:
print ("Unexpected textField case")
self.danceDoc?.choreography[ip.row] = self.choreography[ip.row]
self.danceDoc?.updateChangeCount(.done)
return
else
print ("Error identifying cell from text entry")
return
如何确定点击了哪个 textField 来结束当前 textField 的编辑,以便为它分配第一响应者状态并防止键盘消失?
【问题讨论】:
不要退出当前文本字段,让下一个成为第一响应者。 【参考方案1】:您可能有与此类似的代码,无论如何都会导致键盘关闭:
func textFieldShouldReturn(_ textField: UITextField) -> Bool
textField.resignFirstResponder()
return true
要修复它 - 您需要以编程方式激活下一个文本字段:
func textFieldShouldReturn(_ textField: UITextField) -> Bool
textField.resignFirstResponder()
self.nextTextField.becomeFirstResponder() // Add this line
return true
您可能需要进行额外检查,因为对于最后一个字段,您实际上可能需要关闭键盘。
不是 100% 确定它是否不会影响其他功能,但我相信即使 textField.resignFirstResponder()
行可以省略(以防我们希望键盘留在屏幕上),否则可能会导致一些奇怪的动画键盘。
【讨论】:
如果您要在下一行拨打becomeFirstResponder
,则无需拨打resignFirstResponder
。
已经尝试了这些建议,但仍然遇到同样的问题!还尝试向每个文本字段添加点击操作,但它不能始终如一地工作。当我点击另一个框时,它不会将其识别为文本字段,因此键盘被关闭。
@KJM 我给出了正确的答案。不确定您的代码中还做了什么,但可能有些事情会导致您出现奇怪的行为。
已经用这个代码再次尝试了点击动作:@IBAction func showKeyboardOnTap(_ sender: UITextField) sender.becomeFirstResponder() 它似乎工作,虽然当它不能识别时不一致我的水龙头!非常感谢您的回复。以上是关于将文本输入到包含 UITextFields 的 UITableView 单元格时的键盘控制的主要内容,如果未能解决你的问题,请参考以下文章
滚动时自定义 UITableViewCell 中的 UITextFields 文本出现在其他单元格中
试图查看 UITableViewRowCell 内的两个 UITextFields 是不是包含 iOS 中的文本
如何从 UITableView 中的 UITableViewCells 中的 UITextFields 中获取文本并将它们放入数组中(Swift 3)?