将文本输入到包含 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 中的文本

UIPopover 防止摇晃撤消

动态生成 UITextFields

如何从 UITableView 中的 UITableViewCells 中的 UITextFields 中获取文本并将它们放入数组中(Swift 3)?

在 UITableViewCells 中的 UITextFields 中维护文本