自定义UITableViewCell的问题

时间:2011-11-08 23:19:01

标签: iphone objective-c ios

我有一个带有表单输入屏幕的iPhone应用程序。我通过制作具有UITableViewCellUILabel的自定义UITextfield来完成此操作。我进行了设置,以便“cellForRowAtIndexPath”从Core Data中获取适当的值,UITextField's“textFieldDidEndEditing”方法将适当的值保存到Core Data。它的效果很好......除了:

如果我编辑文本字段,然后将其滚出屏幕,然后单击另一个单元格的文本字段:

  1. 该单元格已自动释放,因为它滚动屏幕
  2. “textFieldDidEndEditing”获取BAD ACCESS错误
  3. 我完全理解这个问题,我只是不确定解决问题的最佳方法。我的第一个想法是将“textFieldDidEndEditing”中的逻辑添加到“dealloc”,但这看起来很糟糕。有什么建议?

4 个答案:

答案 0 :(得分:2)

我最终使用了一个用于滚动视图的委托方法(内置于UITableView中)。当用户开始拖动时,我辞职第一响应者。

这很好用,因为它看起来不错,当用户开始滚动时会调用“textFieldDidEndEditing”,这总是在文本字段离开屏幕之前。

答案 1 :(得分:1)

  • 编辑时禁用滚动
  • 保留textField

这是你可以做的事情。在我看来,最好在编辑时禁用滚动因为用户没有必要,所以要确保他也不能这样做。限制用户可以执行的操作,使其更“安全”并更易于用户使用。

如果您不确定这些事情只是看看苹果做了什么,他们总是在他们的应用程序中。就像在iOS 5上的设置应用程序中一样,当您更改手机的名称时。你只需在下一个tableview中获得1行,这样就不会像用户那样弄乱任何东西..

答案 2 :(得分:0)

在自定义单元格的dealloc中,将textfield的委托设置为nil

答案 3 :(得分:0)

我有一个类似的问题......问题在于可重用的单元格作为表格视图的一部分。每次滚动表时,都会调用cellforRowatIndexPath,并使单元格出列并返回它。遗憾的是,此功能对于具有可保留数据(如标签)的单元格无效。因此,您必须选择自己的单元格出列方法。

我有一个名为cells的NSMutableArray,它可以保存我的所有单元格。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomTableViewCell *cell = [self dequeuwReusableCellwith:indexPath];
if (cell == nil) 
{
    cell = [[CustomTableViewCell alloc] init];
    [cells addObject:cell];
}
// Configure the cell.
NSString *temp = [NSString stringWithFormat:@"Cell %d",indexPath.row];
cell.textField.placeholder=temp;
return cell;
}

这是我自定义deque可重用单元格的方法。

-(CustomTableViewCell*)dequeuwReusableCellwith:(NSIndexPath*)indexpath
{
if([cells count]>indexpath.row)
{
    return [cells objectAtIndex:indexpath.row];
}
return nil;
}

希望这会有所帮助......