1

更新:我已经解决了这个问题,方法是重新标记剩余的单元格,方法是在 for 循环中循环遍历它们,每次将 indexpath 的行递增到剩余的数据量。

我有一个包含 2 个部分的 UITableView。一节是固定的。另一部分动态变化,用户单击按钮并添加新行。这些单元格包含三个用户可以编辑的文本框(标记为 1、2 和 3)。此部分中的行是可编辑的,用户可以滑动和删除。所有这些功能目前都运行良好。这是用户界面:

在此处输入图像描述

当我尝试更新数据源时,无法正常工作。我使用一个数组,其中包含一个名为“ReceiptItem”的自定义类的对象。当用户在单元格中编辑其中一个 UITextField 时,我正在更新“ReceiptItem”中的相应属性。我目前正在使用标签来跟踪正在编辑的单元格和文本字段。

我识别正在编辑的单元格和文本字段的代码是:

- (void)textFieldDidEndEditing:(UITextField *)textField{
    //find the cell and textfield that just ended editing
    int row = textField.superview.tag;
    int column = textField.tag;

    ReceiptItem *itemToBeUpdated = [[ReceiptItem alloc]init];
    itemToBeUpdated = [receiptItemsArray objectAtIndex:row];

    //update the receiptItem
    switch (column) {
        case 1:
            //quantity text field
            itemToBeUpdated.quantityValue = [textField.text doubleValue];
            break;
        case 2:
            //item text field
            if ([textField text].length == 0) {
                itemToBeUpdated.itemName = @"Blank";
            }
            else{
                itemToBeUpdated.itemName = [textField text];
            }
            break;
        case 3:
            //price text field
            itemToBeUpdated.priceValue = [textField.text doubleValue];
            break;
    } 
    [receiptItemsArray replaceObjectAtIndex:row withObject:itemToBeUpdated];
}

我遇到问题的地方是当一行被删除时。我从我的数据源中删除了相应的对象,我的数组计数减一。如果我随后尝试在已删除单元格下方的单元格中编辑文本字段,则会收到“outofbounds”错误,因为该单元格的标记现在大于数组的计数。它发生在这一行(从上面):

itemToBeUpdated = [receiptItemsArray objectAtIndex:row];

我试图弄清楚如何a)更好地跟踪单元格,b)在删除单元格时重新标记单元格或c)其他内容。有什么答案吗?如果需要,我可以在我的单元格被删除的地方发布代码。

4

1 回答 1

1

我猜你在 cellForRowAtIndexPath 的方法中标记 textField if (cell == nil) like,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

            if (cell == nil) {
                 cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]
yourTextField.tag = indexPath.row;            
            }
}

在 if 块之外进行标记,这样当您删除一行并重新加载数据时,您的 textField 将获得如下所示的新标签:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    static NSString *CellIdentifier = @"Cell";
                UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

                if (cell == nil) {
                     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]

                }
yourTextField.tag = indexPath.row;
return cell;
    }
于 2012-12-31T08:07:32.600 回答