【问题标题】:Know the row number inside custom UITableViewCell - new wrinkle知道自定义 UITableViewCell 中的行号 - 新皱纹
【发布时间】:2017-01-15 02:10:31
【问题描述】:

我有一个自定义 UITableViewCell 类。

单元格具有可编辑的 UITextField。编辑此文本字段时,我将编辑的结尾困在

func textFieldDidEndEditing(_ textField: UITextField)

我的自定义单元类实现了 UITextFieldDelegate,所以我确实收到了回调。

与对类似问题的所有其他回复类似 - 我首先尝试在加载表格时将 UITextField 上的标记设置为行号。

这行得通-但是-现在有一个皱纹....我的表允许移动行。移动该行时,它会保留加载表格时的标签,因此我的标签不会从插入中全部关闭。我可以通过在移动后重新加载表格来解决这个问题 - 但这会将列表跳回顶部。

1) 有没有一种更简洁的方法可以在不使用 .tag 的情况下获取自定义单元格类中的行号?因为当我允许移动行时这会失败。

2) 如果没有 #1 那么有没有办法继续并重新加载显示以首先获取当前显示的顶部行,然后在表重新加载后重置到相同的顶部当前行,这样用户就不会跳回顶部?

我也试过用这个

  func tableView(_ tableView: UITableView, didEndEditingRowAt indexPath: IndexPath?)

并在包含 UITableView 的 UIViewController 中捕获编辑的结束,这样我将在编辑后获得行号 BUT 这永远不会被调用。所以解决这个问题的另一种方法可能是强制调用 didEndEditingRowAt。由于某种原因,这不会被调用。即使我将强制结束编辑的请求塞进客户单元类中

var textFieldHandle : UITextField?
func textFieldDidBeginEditing(_ textField: UITextField) {
    print("editing field in cell")
    textFieldHandle = textField
}

func textFieldDidEndEditing(_ textField: UITextField) {
    print("done editing text field in cell with text -\(textField.text!)-")
    if textFieldHandle != nil {
        textFieldHandle?.endEditing(true)   // force end editing so get table event - does not work
        if let index = textFieldHandle?.tag {
            if index >= 0 && index < quizListItems.count {
                // if we have a proper index then store back in answer array so we dont lose it
                quizListItems[index].text = textField.text!
                print("--set value at index \(index)")

            }
        }

    }

}

【问题讨论】:

  • 在您的 cellForRowAtIndexPath 中,您是否为您的 textFields 设置了委托?另一个想法--> stackoverflow.com/a/22063354/4475605
  • hmmm.. 我将表委托放在 ViewController 的 ViewDidLoad 中。我将 TextField 委托放在自定义 Cell 类的 override init( 中。我是否应该在自定义单元类中没有 TextField 委托,而是让 ViewController 有 theTextFiled 委托(并在 VC 中实现 UITextFieldDelegate) ?对于 4475605 的引用,你能详细说明吗?我需要知道单元格的编辑何时完成,以便我可以使用 textFiled didSelectRowAtIndexPath 的新值更新加载表格的数据数组(i don't think) 在编辑完成后调用
  • 在移动 textField 时更新UITextField 的标签?使用 moveRowAtIndexPath 委托并更新 2 个 indexPaths 中存在的 UITextField 的标签。
  • 在“moveRowAt”方法中,我只能访问新插入行的单元格。是的,我可以更改这一行的标签,但是在插入之后,插入下面的所有 .tag 的其余部分都将关闭。我需要重置所有 .tag 。理想情况下,我可以只知道我所在的单元格。我厌倦了使用“didSelectRowAt”但 UITextField 正在吃点击,所以我永远不会调用“didSelectRowAt”,除非我找到远离 UITextField 的薄空间。如果我在单元格中触摸 UITextField,则应该调用“didSelectRowAt”!但不是。令人沮丧。
  • 使用标签是不好的,原因你已经找到了。我建议使用委托并处理视图控制器中的字段(这可能是这段代码所属的地方)。在这里查看我的答案 - stackoverflow.com/questions/28659845/… 你可以根据自己的需要调整它

标签: ios uitableview


【解决方案1】:

我这样做了....

func textFieldDidEndEditing(_ textField: UITextField) {
    let cell: UITableViewCell = textField.superview as! UITableViewCell
    let textFieldIndexPath = tableView.indexPath(for: cell)
    if let index = textFieldIndexPath?.row {
        if index >= 0 && index < quizListItems.count {
            // Stuff the input textField value in to the array that loads the table
            quizListItems[index].text = textField.text!
        }
    }
}

注意:UITextFieldDelegate 在我的 ViewController(包含 UITableView)上,而不是在我的自定义 UITableViewCell 类上

还有什么失败 --- 尝试使用 didSelectRow 和 didDeselectRow - 但这些从未被调用,因为 UITextField 吃掉了点击。在与 didSelect 路径组合中,我尝试禁用或使 UITextField 不接受用户操作,直到我单击该字段。这是一团糟。由于某种原因,尝试将单元格放入 didSelect 和 didDeselect 时出现错误。把它拿出来,然后

什么有效(上面的代码片段)--- 回到 textFieldDidEndEditing 的 UITextField 委托方法并返回到单元格以获取索引。即使在我移动一行时,这仍然有效。

这条路径从 UITextField 返回到单元格,然后从单元格获取索引。

【讨论】:

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