所以我完全被这个人难住,并试图称之为“操作系统错误”。文本编辑后更新UITableView崩溃
我有一个TableView中控制器具有单个部分,并且在该节的报头存在的UITextField。几个操作会导致行被添加/删除而不会出现问题。但是,只要文本在标题中被编辑,并且键盘被解散,任何插入/删除行都会立即崩溃。
它实际上可以进一步简化 - 简单地调用在桌子上beginUpdates/endUpdates一旦键盘被驳回,就足以导致崩溃。 callstack的结尾是:
_CFTypeCollectionRetain
_CFBasicHashAddValue
CFDictionarySetValue
-[UITableView(_UITableViewPrivate) _updateWithItems:withOldRowData:oldRowRange:newRowRange:context:]
-[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:]
-[UITableView endUpdates]
我已经放在一起演示了这个问题的一个最小的例子。
完成控制器来源:http://www.andrewgrant.org/public/TableViewFail.txt
示例项目:http://www.andrewgrant.org/public/TableViewCrash.zip
最相关的代码:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
// create header view
UIView* header = [[[UIView alloc] initWithFrame:CGRectMake(0.f, 0.f, 320.f, 50.f)] autorelease];
// text field
UITextField* textField = [[[UITextField alloc] initWithFrame:CGRectMake(10.f, 12.f, 300.f, 28.f)] autorelease];
textField.text = @"Edit, then 'Save' will crash";
textField.borderStyle = UITextBorderStyleRoundedRect;
textField.clearButtonMode = UITextFieldViewModeAlways;
textField.delegate = self;
[header addSubview:textField];
return header;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
// no purpose, but demonstrates updates work at this point
[self.tableView beginUpdates];
[self.tableView endUpdates];
[textField resignFirstResponder];
// immediate crash
[self.tableView beginUpdates];
[self.tableView endUpdates];
return YES;
}
值得注意的是 - 无论textField委托是控制器还是完全不相关的对象实例,都会发生崩溃。 – 2010-07-05 20:34:28
我看着你的项目。它在3.x中运行正常,但正如你所说的,当你点击保存时它会在4.0上崩溃。 +1对于棘手的问题:) – Kalle 2010-07-05 21:02:19
想到的一件事是,你的XIB文件有一个表视图,它指向RootViewController作为它的数据源和委托,而根视图控制器反过来实例化一个TableViewFail实例并将其设置为“on最佳”。不应该是一个问题,但你有两张桌子堆叠在一起。 – Kalle 2010-07-05 21:18:46