Izz*_*npo 0 objective-c uitableview uitextfield nsindexpath becomefirstresponder
因此,我正在尝试模拟管理电话号码时标准Apple代码在联系人应用上的工作方式.具体来说,我正在努力从tableview中删除一行,如果它是空的并且用户导航到任何其他行
我的问题是,当tableview重新加载导致UITextField重新签名其响应者时,我需要再次为用户导航到的文本字段设置响应者
我有UITextField委托,我正常处理 textFieldShouldBeginEditing , textFieldDidBeginEditing , textFieldShouldEndEditing , textFieldDidEndEditing
为了处理这个功能,我的代码就在textFieldDidEndEditing其中,我从tableview数组中删除了数据,并且由于tableview有2个部分,我正在调用:
[MyTableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];
Run Code Online (Sandbox Code Playgroud)
在textFieldDidBeginEditing我使用以下命令保存正在编辑的textField的indexPath 期间:
EditableCustomCell *textFieldCell = (EditableCustomCell *)[[textField superview] superview];
NSIndexPath *indexPath = [MyTableView indexPathForCell:(EditableCustomCell *)textFieldCell];
responderIndexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section];
Run Code Online (Sandbox Code Playgroud)
然后我使用以下代码将正确的行textField设置为第一个响应者:
EditableCustomCell *customCell = (EditableCustomCell *)[MyTableView cellForRowAtIndexPath:responderIndexPath];
[customCell.editableTextField becomeFirstResponder];
Run Code Online (Sandbox Code Playgroud)
一切似乎都很好,直到接近处理结束时,突然textFieldDidBeginEditing开始返回第0行第0行的indexPath(即使在检查标记值或包含的文本时返回文本字段的正确值)
以下是上述过程开始时的日志:
- textFieldDidEndEditing started <-- start of delete processing
- textFieldDidEndEditing - tableviewData - replacing object at index 1
CustomTableViewController.deleteRow - delete called for indexPath section 1 ... row 1
- reloading MyTableView
- CustomTableViewController-cellForRowAtIndexPath started
CustomTableViewController-cellForRowAtIndexPath section=1 row=0
CustomTableViewController-cellForRowAtIndexPath ending
CustomTableViewController-cellForRowAtIndexPath section=1 row=1
CustomTableViewController-cellForRowAtIndexPath ending
CustomTableViewController-cellForRowAtIndexPath section=1 row=2
CustomTableViewController-cellForRowAtIndexPath ending
- textFieldShouldBeginEditing started
indexPath for textFieldShouldBeginEditing is : section 1 row 1
- textFieldShouldBeginEditing ending
- textFieldDidBeginEditing started
indexPath for textFieldDidBeginEditing is : section 1 row 1 text 3 tag 1
- textFieldDidBeginEditing ending
- textFieldDidEndEditing ending <-- end of delete processing
- textFieldDidBeginEditing started
- textFieldDidBeginEditing ... setting responderIndexPath section 0 row 0
indexPath for textFieldDidBeginEditing is : section 0 row 0 text 123 tag 0
- textFieldDidBeginEditing ending
Run Code Online (Sandbox Code Playgroud)
从日志的最后一部分可以看出,在textFieldDidEndEditing完成之后,textFieldDidBeginEditing调用但返回第0部分和第0行(行保持显示并始终可见)
我既不明白为什么调用它,也不知道为什么它没有返回正确的indexPath.可以看出,为值返回了文本(在这种情况下输入的值为123),我已经使用其他数据和其他行验证了这一点(对于文本字段的文本和标记)
也许我对becomeFirstReponsder内部的设置textFieldDidEndEditing是不正确的,尽管如果这是真的,我不知道在哪里处理它
希望有人能够更好地理解这一点可以帮助我,正如你所知道的那样,我已经经历了几个小时而没有任何解决方案
谢谢Izzy
编辑1: 在代码中,所有被调用的都是becomeFirstReponder在textFieldDidEndEditing完成之前.cellForRowAtIndexPath完成后查看日志时,它会输入并存在文本字段TWICE,一次是针对刚刚删除的行下面的行,然后再返回为indexPath的部分/行返回0时?我无法理解导致此post表重新加载方法的事件序列
编辑2: 它只是我,还是在日志结束textfieldSHOULDbeginEditing之前没有NO似乎真的很奇怪textFieldDidBeginEditing?是不是我通过重新加载表来搞砸内部过程textFieldDidEndEditing?有没有更好的地方这样做(即删除一行并重新加载tableview以显示UI更新)?
好的,回答我自己的问题......
经过大量的调试,似乎......
我正在通过重新加载tableview期间对标准UI工作流程进行干预textfieldDidEndEditing
调用reloaddata会破坏tableview单元格(以及单元格中包含的所有对象,即UITextFields,UILabels等)并重新创建它们,从而导致
通过将此调用移动到一个独立按钮,它按预期运行,而indexPath返回0(当它到达这一点时,我仍然不完全理解调用堆栈,但是嘿)
现在我的大问题是决定何时以编程方式调用重新加载,因为我希望它驱逐离开文本字段的事件...我感觉到另一个问题:
希望我的ramblings可以帮助将来尝试做类似事情的人...
| 归档时间: |
|
| 查看次数: |
1234 次 |
| 最近记录: |