UITableViewCell中的UITextField并在选定的单元格键盘上显示/隐藏故障时成为FirstResponder

时间:2019-01-03 13:12:54

标签: ios swift uitableview uitextfield uiresponder

我有这样的视图层次结构:

  

View Controller

     
    

UITableView

         
      

UITableViewCell

             
        

UITextField

      
    
  

我在自定义UITableViewCell中有一个textField,我的计划是让该textField在用户点击单元格后立即成为FirstResponder。第一个问题是textField正在获取触摸事件,因此未选择单元格,因此,当用户在textField上单击鼠标右键时,未选择单元格,并且我无法更新所选的单元格UI 。尽管可以在isUserInteractionEnabled=false上制作textField,所以在用户点击textField之后,我的单元格将具有适当的选择行为。到目前为止,一切都很好。现在,我想在自定义单元格的setSelected方法中处理此选择。问题是,如果键盘已经在屏幕上,并且我在becomeFirstResponder()上执行了textField,那么键盘就会隐藏起来并立即再次显示。通常,我希望此键盘能够保持原位,而不会尝试再次隐藏和显示。这是代码:

class StringFieldTableViewCell: UITableViewCell {

    @IBOutlet weak var pinLine: UIView!
    @IBOutlet weak var pinLineFocused: UIView!
    @IBOutlet weak var textField: UITextField!


    override func awakeFromNib() {
        super.awakeFromNib()
        self.selectionStyle = .none
        self.textField.isUserInteractionEnabled = false
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        self.textField.isUserInteractionEnabled = selected
        if selected {
            self.textField.becomeFirstResponder()
        }
        self.pinLine.isHidden = selected
        self.pinLineFocused.isHidden = !selected
    }
}

有人知道如何解决此键盘显示/隐藏问题,为什么键盘会先隐藏自己然后在很短的时间内显示?

1 个答案:

答案 0 :(得分:0)

您的代码中的问题是您正在禁用textField交互,因为您的单元格中有textField,如果您点击该单元格,则将与textField交互,而不是单元格本身。

因此,即使您的单元格中有textField,也可以选择行。

首先,您需要在点击该文本字段时获得提示。

为此,您可以使用它。...

let pointInTable = textField.convert(textField.bounds.origin, to: self.tableView)

它将为您提供一个CGPoint([x,y])的值,例如[0.0,0.0]或[0.0,44.0]。取决于您的单元格的高度。

现在,有一个将CGPoint转换为IndexPath的函数。

let textFieldIndexPath = tableView.indexPathForRow(at: pointInTable)

现在这将是我们的indexPath。

现在您可以使用cellSelected功能。

tableView.selectRow(at: textFieldIndexPath, animated: true, scrollPosition: .none)

整个代码如下:

let pointInTable = textField.convert(textField.bounds.origin, to: self.tableView)
let textFieldIndexPath = self.tableView.indexPathForRow(at: pointInTable)

tableView.selectRow(at: textFieldIndexPath, animated: true, scrollPosition: .none)

您可以将其放在textFieldDidBeginEditing函数中。