我有一个实现了一个基于6-IOS项目UITableView
。 在表视图每个单元包含一个UITextField
允许用户输入信息。 如果用户清除文本字段中,或从场删除所有输入(即[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'
我从来没有见过这条消息,并有不似乎是它特别多引用在网上搜索时。 我将不胜感激,就如何解决这个问题的任何建议。
我从来没有见过那个消息之前,但我的眼前的冲动,如果我看到这将是:尽量延迟性能。 即使这样简单的东西可能是一个有趣的实验:
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView deleteRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
});
我想到这里,让我们不要尝试删除该行,而文本字段仍处于(即同时报告textFieldEditingDidEnd
仍在运行); 让我们给runloop机会完成其周期。
我也面临着同样的问题。 而键盘是目前需要调用resignFirstResponder
第一然后调用UITableview
重载方法后,
(void)textFieldDidEndEditing:(UITextField *)textField
委托方法执行或内:
(void)textFieldDidEndEditing:(UITextField *)textField{
[tableview reloadData];
}
我崩溃是从一个可编辑UIWebView
一个内部UICollectionViewCell
。 以下固定它:
[self.view endEditing:YES]
我碰到同样的NSInternalInconsistencyException
例外。 我的解决办法如下:
textView.selectedTextRange = nil; // clear the selected text
[textView resignFirstResponder];
删除时得到这个错误UITableViewCell
包含一个UITextView
从键盘隐藏UIKeyboardWillHideNotification
通知。
修复是逻辑移入UIKeyboardDidHideNotification
我碰到这个问题时,我的方法是textFieldShouldEndEditing在某些情况下返回NO
我也经历了同样的问题。 即使叫“resignFirstResponer”和“endEditing”后,可以发现,被撞毁。
当我和@马特的方法试过了,工作正常。 感谢马特。
这似乎是因为我们添加的“deleteRowsAtIndexPaths:”到GCD队列,队列将确保上一个任务是在队列中完成,然后才开始在main_queue下一个任务。 因此,无需添加任何延迟。