【发布时间】: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