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