尝试删除包含拒绝辞职的第一响应者的行

我有一个基于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]; } 

我遇到了相同的NSInternalInconsistencyExceptionexception。 我的解决scheme如下:

 textView.selectedTextRange = nil; // clear the selected text [textView resignFirstResponder]; 

从键盘隐藏UIKeyboardWillHideNotification通知中删除包含UITextViewUITableViewCell时出现此错误。

修正是将逻辑移入UIKeyboardDidHideNotification

当我的方法textFieldShouldEndEditing在某些情况下返回NO时,我遇到了这个问题

我也遇到了同样的问题。 即使在调用“resignFirstResponer”和“endEditing”之后,发现它正在崩溃。

当我用@亚特的方法尝试,它工作正常。 谢谢马特。

看起来,因为我们在GCD队列中添加了“deleteRowsAtIndexPaths:”,队列将确保先前的任务在队列中完成,然后只在main_queue中启动下一个任务。 因此不需要延迟。