我有一个ViewController,它包含一个UITableView,其中的单元格是通过自定义子视图创建的(这样每个单元格都有一个标签和文本字段)。子视图包括在textFieldDidBeginEditing,textFieldDidEndEditing等上触发的TextField委托方法.UITableView缓存可见的单元格,并在单元格不再可见时销毁它们。我遇到的问题是当用户点击单元格中的TextField然后滚动表格以便被“编辑”的单元格不在视图中然后点击新单元格进行编辑时,原始单元格的textFieldDidEndEditing委托方法是调用,导致“respondsToSelector:]:消息发送到解除分配的实例”错误,因为当UITableView滚动到可见区域时,原始/第一个TextField已被销毁。
之前是否有人处理过此问题并找到了解决方案,以便我可以保留textFieldDidEndEditing方法以正确处理用户输入的数据而不会破坏现在不可见的单元格?
编辑:我刚刚在UITableView类参考文档中找到了这个:“避免重新布局内容。当重复使用自定义子视图的单元格时,每次表格视图请求单元格时都不要布置这些子视图。布置子视图一次,什么时候创建单元格。“我认为这是我的问题的根源。但我不确定如何遵循这个建议。帮助...
答案 0 :(得分:2)
“当一个单元格不再可见时,UITableView会缓存可见的单元格并销毁它们。”只有在您不提供重用标识符时才会这样。
假设您正在处理每个单元格(至少在概念上)呈现某个模型对象的属性的详细信息视图,您可以为每个单元格分配唯一的重用标识符。您可以直接在Interface Builder中设置它,或者,如果您以编程方式创建单元格,则将其作为参数传递给initWithStyle:reuseIdentifier:
或initWithFrame:reuseIdentifier
。
给定重用标识符,表视图将缓存单元的整个生命周期。要从缓存中获取单元格,请使用
cell = [tableView dequeueReusableCellWithIdentifier:@"Some Identifier You Made Up"];
如果需要,再次使用不同的标识符来区分唯一的单元格。
具有固定数量的唯一单元格的详细视图的替代方法是存储对实例变量中的每个单元格的引用(或将它们的整个组存储在集合中)。只要保留实例变量,即使您没有提供重用标识符,也不会释放单元格。
答案 1 :(得分:0)
我想知道这可能是你的问题:
if (cell == nil) {
// dont do this -->cell = [[[customCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
NSArray *topLevelsObjects = [[NSBundle mainBundle] loadNibNamed:@"NewUserCustomCell" owner:nil options:nil];
for (id currentObject in topLevelsObjects){
if ([currentObject isKindOfClass:[UITableViewCell class]]){
cell = (customCell *) currentObject;
break;
}
}
答案 2 :(得分:0)
我不知道你是否找到了解决方案。但我面临同样的问题,我通过在释放它之前将textfield的委托设置为自定义字段的dealloc中的nil来修复它。这样,在释放的单元格上不会调用委托textFieldDidEndEditing。 我也没有使用重用标识符。
- (void)dealloc {
[textField_ setDelegate:nil];
[textField_ release];
[super dealloc];
}