在向包含UITextFields的UITableView单元格中输入文本时控制键盘

时间:2018-12-08 23:05:55

标签: ios swift uitableview uitextfield

我有一个UITableView,其中的自定义单元格包含两个用于文本输入的UITextFields。我希望键盘一直保持在原位置,直到完成文本输入为止,但是当敲击第二个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
    }
} 

如何确定要输入哪个文本字段来结束当前文本字段的编辑,因此我可以为其分配第一响应者状态并防止键盘消失?

1 个答案:

答案 0 :(得分:0)

您可能具有与此类似的代码,无论如何,这都会导致键盘被开除

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()行(以防我们希望键盘保留在屏幕上),否则可能会导致一些奇怪的动画键盘。