ios - UITableViewCell 中的 UITextField 和所选单元格键盘上的变为FirstResponder 显示/隐藏故障

标签 ios swift uitableview uitextfield uiresponder

我有这样的 View 层次结构:

View Controller

UITableView

UITableViewCell

UITextField

我的自定义有UITableViewCell一个textField我的计划是做这个 textField一旦用户点击单元格,就会成为FirstResponder。第一个问题是textField正在获取触摸事件并且因此未选择单元格,因此当用户右键点击 textField 时那么单元格未被选择,我无法更新所选单元格的用户界面。我想我可以做isUserInteractionEnabled=falsetextField所以当用户点击 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
    }
}

有谁知道如何解决这个键盘显示/隐藏问题以及为什么键盘首先尝试隐藏自己然后在很短的时间内显示?

最佳答案

代码中的问题是您禁用了文本字段交互,因为单元格中有文本字段,如果您点击单元格,您将与文本字段交互,而不是单元格本身。

因此,即使单元格中有 textField,也有一种方法可以选择行。

首先,您需要获取点击该文本字段的时间。

为此你可以使用这个......

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

它会给你一个 CGPoint([x, y]) 中的值,例如 [0.0, 0.0] 或 [0.0, 44.0]。取决于您的 Cell 的高度。

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

let textFieldIndexPath = tableView.indexPathForRow(at: pointInTable)

现在这将是我们的索引路径。

现在您可以使用 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 函数中。

关于ios - UITableViewCell 中的 UITextField 和所选单元格键盘上的变为FirstResponder 显示/隐藏故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54023006/

相关文章:

iOS 分发证书接受不起作用

ios - 无法在 Swift 中将变量传递给 prepareForSegue?

ios - 使用 ReactiveCocoa 的 iOS 应用程序的 ViewModel 模式

ios - pod 安装后项目不工作

ios - Apple 推荐的 Swift 日志记录方法

ios - TableView 单元格到另一个 View Controller

ios - Swift 从 firebase 存储中删除图像

swift - Swift 中 SKProduct 的 NSCoding 错误

ios - Swift:用常量字符串声明常量数组

ios - 在 UITableViewCell 中添加 UICollectionView 时出错