使用UIStepper更新UITableViewCell内容

时间:2013-11-17 17:02:53

标签: ios objective-c uitableview uistepper

我有一个包含多个部分的表视图,以及自定义表视图单元格。我正在尝试在我的单元格中放置一个步进器,并使用一个标签来指示步进器值。我在视图控制器的单元格中为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属性,以便它可以正确更改。

1 个答案:

答案 0 :(得分:0)

它会在所有部分中发生变化,因为所有单元格都有一个mealAmountField,并告诉他们将文本设置为步进器的值。要解决此问题,您需要在数据源中使用“字段”来跟踪标签中的值。根据您的单元格的数据源现在的样子,此“字段”可能是字典中的键值对,您的数据源是字典数组。在步进器的操作方法中,您将获得步进器所在单元的indexPath,并使用该值更新字典数组中的正确条目。这是表视图始终有效的方式 - 它们用于显示值,而不是用于存储它们。