textFieldDidEndEditing vs didSelectRowAtIndexPath,后者不被调用

Posted

技术标签:

【中文标题】textFieldDidEndEditing vs didSelectRowAtIndexPath,后者不被调用【英文标题】:textFieldDidEndEditing vs didSelectRowAtIndexPath, the later not being called 【发布时间】:2016-08-05 15:05:14 【问题描述】:

我有一个带有UITextFieldUITableView 的视图。当用户输入文本时,我希望调用didSelectRowAtIndexPath,不幸的是它不是。似乎文本字段的焦点阻止了 didSelectRowAtIndexPath 被调用。

我找到的第一个解决方案是创建一个手势识别器并检查事件坐标是否在表格内,然后检查在哪一行。但我想做一个更简单的解决方案,我可能遗漏了一些东西。

编辑:文本字段不在单元格内,在表格外,您建议的答案就像在单元格内一样。

【问题讨论】:

一个小技巧,会在 UITextFieldDelegate (In textFieldShouldBeginEditing:?) 方法中获取 UITextField 的 superview 直到你得到单元格(取决于如何管理自定义单元格),并调用自己tableView:didSelectRowAtIndexPath:. 请添加一些您尝试过的相关代码。 问题不够清楚:文本域不在单元格内,在表格外 你好@AR89,你能找到解决办法吗? 【参考方案1】:

textFieldDidBeginEditing 被调用时,你可以获得单元格行,然后根据需要使用它:

func textFieldDidBeginEditing(textField: UITextField) 
    let currentCell = textField.superview!.superview! // Get the cell
    let indexPath = tableView.indexPathForCell(currentCell)
    let currentRow = (indexPath?.row)! // Get the row of that cell

【讨论】:

文本域不在单元格内,在表格外【参考方案2】:

在 cellForRow 中,将 UITextField 的标签设置为 indexPath.row。现在,当您的文本字段开始编辑时,您将拥有 indexpath 的行,并且可以在需要时获取 cellForRow。将您的“didSelectRowAtIndexPath”函数逻辑放在一个单独的函数中,并从 didSelect 和 beginEditing 中调用该新函数。

【讨论】:

将标签设置为indexPath.row 仅在您有一个部分并且行已固定时才有效。【参考方案3】:

在 uitableview 的 cellForRowAIndexPath 方法中编写代码,防止 didSelectForRowAtIndexPath cslled 方法。

tableview.selectiostyle = UItableviewSelectionStayle.None

【讨论】:

以上是关于textFieldDidEndEditing vs didSelectRowAtIndexPath,后者不被调用的主要内容,如果未能解决你的问题,请参考以下文章

textFieldDidEndEditing 触发“为时已晚”

textFieldDidEndEditing 替代

textFieldDidEndEditing 未在 swift 中调用

在文本字段中插入一个字符后启用完成按钮: textFieldDidEndEditing: 或 textFieldShouldBeginEditing: 或?

当调用 textFieldDidEndEditing 时,应用程序冻结

如何将文本字段更改通知合并到 textFieldDidEndEditing