Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何动态更改UITableViewCell';在删除行中的单元格之前,是否标记?_Objective C_Ios_Uitableview - Fatal编程技术网

Objective c 如何动态更改UITableViewCell';在删除行中的单元格之前,是否标记?

Objective c 如何动态更改UITableViewCell';在删除行中的单元格之前,是否标记?,objective-c,ios,uitableview,Objective C,Ios,Uitableview,更新:我已经解决了这个问题,通过在for循环中按顺序重新标记剩余的单元格,每次递增indexath的行,直到剩余的数据量为止 我有一个包含两个部分的UITableView。一部分是固定的。另一个部分动态更改,用户单击按钮并添加新行。单元格包含三个用户可以编辑的文本框(标记为1、2和3)。此部分中的行是可编辑的,用户可以滑动和删除。所有这些功能目前运行良好。以下是用户界面: 当我试图更新数据源时,工作不正常。我使用一个数组,其中包含名为“ReceiptItem”的自定义类的对象。当用户编辑单元格

更新:我已经解决了这个问题,通过在for循环中按顺序重新标记剩余的单元格,每次递增indexath的行,直到剩余的数据量为止

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

当我试图更新数据源时,工作不正常。我使用一个数组,其中包含名为“ReceiptItem”的自定义类的对象。当用户编辑单元格中的一个UITextFields时,我正在更新“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”错误,因为该单元格的标记现在大于数组的计数。发生在这一行(从上面):


我正试图弄明白我怎样才能更好地跟踪单元格,b)删除单元格时重新标记单元格,或者c)做其他事情。有答案吗?如果需要,我可以在删除我的单元格的地方发布代码

如果(cell==nil)喜欢,我猜您是在CellForRowatineXpath的方法中标记textField

将标记置于if块之外,这样当您删除一行并在重新加载数据调用时,您的文本字段将获得如下新标记:

- (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;
    }

如果(cell==nil)喜欢,我猜您是在cellForRowAtIndexPath的方法中标记textField

将标记置于if块之外,这样当您删除一行并在重新加载数据调用时,您的文本字段将获得如下新标记:

- (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;
    }

删除行后,在cellForRowAtIndexPath方法中重新加载表数据并重新标记单元格。不要使用标记存储状态。使用单元格的索引路径返回数据。@carlvaezey我想这样做。但是,在UITextField委托方法-(void)textfielddidediting:(UITextField*)textField中,我只能访问一个textField。您知道一种不使用标记就为UITextField所在的单元格提取indexpath的方法吗?@IkegawaTaro因为您使用textField.superview.tag从单元格中提取标记,所以在获取带有textField的单元格后,请使用
UITableView上的
-indexPathForCell:
方法。superview@CarlVeazey谢谢这是有道理的-我是新手,还没有使用indexPathForCell:方法。删除行后,在cellForRowAtIndexPath方法中重新加载表数据并重新标记单元格。不要使用标记来存储状态。使用单元格的索引路径返回数据。@carlvaezey我想这样做。但是,在UITextField委托方法-(void)textfielddidediting:(UITextField*)textField中,我只能访问一个textField。您知道一种不使用标记就为UITextField所在的单元格提取indexpath的方法吗?@IkegawaTaro因为您使用textField.superview.tag从单元格中提取标记,所以在获取带有textField的单元格后,请使用
UITableView上的
-indexPathForCell:
方法。superview@CarlVeazey谢谢这是有道理的-我是新手,还没有使用indexPathForCell:方法。我实际上不是在CellForRowatineXpath中标记文本字段,而是在IB中。我是在该方法中标记单元格。我正在努力实现重新加载数据调用。我想这会解决问题。我实际上不是在CellForRowatineXpath中标记文本字段,而是在IB中标记。我是用这种方法标记单元格的。我正在努力实现重新加载数据调用。我想那会解决问题的。
- (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;
    }