尝试删除包含拒绝辞职的第一响应者的行
我有一个基于iOS 6的项目,实现了一个UITableView
。 表格视图中的每个单元格都包含一个允许用户input信息的UITextField
。 如果用户在点击另一个单元格(文本字段)时清除了文本字段,或者删除了该字段的所有input(即[textfield length] == 0
),则会从表格视图中删除前一个单元格(文本字段)因为它是空的 – 这避免了在表格视图中积累的空单元格。
这一切都是通过使用名为-textFieldEditingDidEnd:
的方法完成的,该方法在文本字段的UIControlEventEditingDidEnd
事件上触发:
- (void)textFieldEditingDidEnd:(UITextField *)textField { NSIndexPath *indexPath = // Index path of the row in the table view if ([textField.text length] == 0) { // Delete the cell from the table view [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } }
但是,启动代码时,应用程序会在控制台上显示以下消息:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempt to delete row containing first responder that refused to resign'
我以前从来没有见过这个信息,在search网页时似乎没有特别多的引用。 我将不胜感激关于如何解决这个问题的任何build议。
我以前从来没有见过这样的信息,但是如果我看到这样的话,我的直接冲动是:尝试延迟的表演。 即使是这样简单的事情也许是一个有趣的实验:
dispatch_async(dispatch_get_main_queue(), ^{ [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; });
我的想法是,让我们不要试图删除行,而文本字段仍然报告(即textFieldEditingDidEnd
仍在运行); 让runloop有机会完成它的循环。
我的崩溃来自UICollectionViewCell
内部的可编辑的UIWebView
。 以下修复它:
[self.view endEditing:YES]
我也面临同样的问题。 当键盘出现时,您需要先调用resignFirstResponder
然后调用UITableview
重载方法
(void)textFieldDidEndEditing:(UITextField *)textField
委托方法执行或内部:
(void)textFieldDidEndEditing:(UITextField *)textField{ [tableview reloadData]; }
我遇到了相同的NSInternalInconsistencyException
exception。 我的解决scheme如下:
textView.selectedTextRange = nil; // clear the selected text [textView resignFirstResponder];
从键盘隐藏UIKeyboardWillHideNotification
通知中删除包含UITextView
的UITableViewCell
时出现此错误。
修正是将逻辑移入UIKeyboardDidHideNotification
当我的方法textFieldShouldEndEditing在某些情况下返回NO时,我遇到了这个问题
我也遇到了同样的问题。 即使在调用“resignFirstResponer”和“endEditing”之后,发现它正在崩溃。
当我用@亚特的方法尝试,它工作正常。 谢谢马特。
看起来,因为我们在GCD队列中添加了“deleteRowsAtIndexPaths:”,队列将确保先前的任务在队列中完成,然后只在main_queue中启动下一个任务。 因此不需要延迟。