我有一个包含多个部分的表视图,以及自定义表视图单元格。我正在尝试在我的单元格中放置一个步进器,并使用一个标签来指示步进器值。我在视图控制器的单元格中为UIStepper添加了一个IBAction(我认为视图控制器应该处理此事件而不是单元格):
- (IBAction)mealAmountStepperChanged:(id)sender
{
// Get the cell in which the button was pressed
SOMealTableViewCell *cell = (SOMealTableViewCell *)[[sender superview] superview];
// Get the value of the stepper (it has an outlet in my custom cell
int value = cell.mealAmountStepper.value;
// Update the text field of the cell with the new value (also has an outlet in the custom cell)
cell.mealAmountField.text = [NSString stringWithFormat:@"%d",value];
}
问题是这个方法更新了所有部分中的相应字段,而不仅仅是我想要的部分。如何设置仅在一个单元格中更改文本?
我已经为我的Meal类添加了一个“amount”属性(它提供了表视图单元格的数据)并且mofidied为mealAmountStepperChanged:方法:
- (IBAction)mealAmountStepperChanged:(id)sender
{
// Get the cell in which the button was pressed
SOMealTableViewCell *cell = (SOMealTableViewCell *)[[sender superview] superview];
// Get the value of the stepper (it has an outlet in my custom cell
int value = cell.mealAmountStepper.value;
// Get the indexpath of the cell in which the stepper was pressed
NSIndexPath *indexPath = [self.menuTableView indexPathForCell:cell];
SOMealManager *manager = [SOMealManager sharedMealManager];
SOMeal *currentMeal;
switch (indexPath.section)
{
case 0:
currentMeal = manager.startersArray[indexPath.row];
break;
case 1:
currentMeal = manager.soupsArray[indexPath.row];
break;
case 2:
currentMeal = manager.mainDishesArray[indexPath.row];
break;
case 3:
currentMeal = manager.dessertsArray[indexPath.row];
break;
case 4:
currentMeal = manager.drinksArray[indexPath.row];
break;
case 5:
currentMeal = manager.alcoholicDrinksArray[indexPath.row];
break;
default:
break;
}
currentMeal.amount = value;
dispatch_async(dispatch_get_main_queue(), ^
{
[self.menuTableView reloadData];
});
}
现在该操作一次只更新一行,但似乎步进器值对于所有部分保持相同(因此当我更新另一部分中的单元格时,它不会从0开始,但是在值处它在上一节中改变了。)
如果我添加cellForRowAtIndexPath:table view datasource方法,可以解决上一个问题:
cell.mealAmountStepper.value = currentMeal.amount;
它将步进器的值设置为Meal对象的amount属性,以便它可以正确更改。
答案 0 :(得分:0)
它会在所有部分中发生变化,因为所有单元格都有一个mealAmountField,并告诉他们将文本设置为步进器的值。要解决此问题,您需要在数据源中使用“字段”来跟踪标签中的值。根据您的单元格的数据源现在的样子,此“字段”可能是字典中的键值对,您的数据源是字典数组。在步进器的操作方法中,您将获得步进器所在单元的indexPath,并使用该值更新字典数组中的正确条目。这是表视图始终有效的方式 - 它们用于显示值,而不是用于存储它们。