【问题标题】:UITextField in UITableViewCell and becomeFirstResponder on selected cell keyboard show/hide glitchUITableViewCell 中的 UITextField 和所选单元格键盘上的 becomeFirstResponder 显示/隐藏故障
【发布时间】:2019-05-30 02:02:18
【问题描述】:

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

视图控制器

UITableView

UITableViewCell

UITextField

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

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.isFirstResponder
  • 不,这不是重复的。我以前看过这个,但它并没有帮助我隐藏/显示键盘问题。 @IBAction isFirstResponder 如何帮助我解决我描述的这个键盘问题?
  • 如果选择 && !textField.isFirstResponder { textField.becomeFirstResponder() }
  • 嗯。这是行不通的。当我选择不同的单元格时,键盘会隐藏和显示。

标签: ios swift uitableview uitextfield uiresponder


【解决方案1】:

您的代码中的问题是您在某种程度上禁用了 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]。取决于 Cell 的高度。

现在,有一个函数可以将 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函数中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多