2

我有可编辑的表格视图单元格,当我从表格中的第一个文本字段移动到最后一个文本字段时,它崩溃了。代码是。下面的代码用于文本字段委托

-(void)textFieldDidBeginEditing:(UITextField *)sender
{
   NSIndexPath *indexpath = [NSIndexPath indexPathForRow:sender.tag inSection:1];
    EditableTextFieldCell *cell = (EditableTextFieldCell *)[self.documentdetailTable cellForRowAtIndexPath:indexpath];
    self.actField = cell.textFieldOne;
    if([self.actField canBecomeFirstResponder]){
        [self.actField becomeFirstResponder];
    }
}
 -(BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
   if (self.actField == textField) {
      [self.actField resignFirstResponder];
    }
    return YES;
}
-(void)textFieldDidEndEditing:(UITextField*)sender
{
if (self.quantityValue !=nil)
        {
            [self.quantityArray replaceObjectAtIndex:[sender tag] withObject:sender.text];
            [[self.documentItemsArray objectAtIndex:[sender tag]] setQUANTITY:[NSNumber numberWithDouble:[sender.text doubleValue]]];
            [self.documentdetailTable reloadData];
        }
}
- (BOOL)textFieldShouldClear:(UITextField *)textField {
self.quantityValue=@"";
return YES;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
-(void)textFieldDidChange:(UITextField *)theTextField
{
    NSLog( @"text changed: %@", theTextField.text);
    self.quantityTextField = theTextField;
    self.actField = theTextField;

}

//add the textfield listeners
[self.quantityTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingDidBegin];

但它正在崩溃,我收到如下消息:

**EditableTextFieldCell _didChangeToFirstResponder:]: message sent to deallocated instance 0xc3c6bf0**
4

3 回答 3

8

我们遇到了同样的问题,这是因为我们使用“旧代码”来创建/出列自定义 UITableViewCells ......

我们要做的就是在 ViewDidLoad 中添加这一行

[self.myTableView registerClass:[ExpenseListCell class] forCellReuseIdentifier:@"ExpenseListCell"];
[self.myTableView registerNib:[UINib nibWithNibName:@"ExpenseListCell" bundle:nil] forCellReuseIdentifier:@"ExpenseListCell"];

然后“清理”函数 cellForRowAtIndexPath 以仅使用 dequeue 函数:

ExpenseListCell *cell = (ExpenseListCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

我怀疑,由于它们包含情节提要,因此 dequeueReusableCellWithIdentifier 管理单元的创建,因此您不再需要我们在出队后仍在使用的这些行:

if(cell == nil)
{
    cell = [[[NSBundle mainBundle] loadNibNamed:@"ExpenseListCell" owner:cell options:nil] objectAtIndex:0];
}

注意:我们没有使用故事板

改变这一点,解决了我们在 iOS7 上的问题。

于 2013-10-16T08:14:07.537 回答
4

可能这个答案有点愚蠢,但正确的答案。我检查了 tableview cellforrowatindexpath 并添加了一个标识符

static NSString *EditableTextFieldCellIdentifier = @"EditableCell";

// using custom cells to show textfield and multiple columns
EditableTextFieldCell *cellText = [tableView dequeueReusableCellWithIdentifier:EditableTextFieldCellIdentifier];

这解决了我的问题,也崩溃了。

于 2013-09-30T11:11:13.153 回答
0

有同样的问题。我通过将标识符放置在表格视图单元格的 nib 文件中来修复它。然后在 cellForRowAtIndexPath 进行出队调用:

static NSString *fsCellIdentifier = @"configurationCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:fsCellIdentifier];
于 2013-10-24T22:28:58.713 回答