Обновление содержимого UITableViewCell с помощью UIStepper

У меня есть представление таблицы с несколькими разделами и пользовательскими ячейками представления таблицы. Я пытаюсь поместить степпер в свои ячейки и метку, указывающую значение степпера. Я добавил IBAction для UIStepper внутри ячейки в моем контроллере представления (я решил, что контроллер представления должен обрабатывать это событие вместо ячейки):

- (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 (который предоставляет данные для ячеек представления таблицы) и модифицировал метод foodAmountStepperChanged::

- (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:

cell.mealAmountStepper.value = currentMeal.amount;

Он устанавливает значение шагового двигателя в свойство суммы объекта Meal, чтобы оно изменялось правильно.


person József Vesza    schedule 17.11.2013    source источник
comment
Вам нужно [[sender superview] superview]? Или просто [sender superview]?   -  person nhgrif    schedule 17.11.2013
comment
Мне нужен [[sender superview] superview], и он отлично работает, возвращает правильную ячейку.   -  person József Vesza    schedule 17.11.2013


Ответы (1)


Он меняется во всех разделах, потому что во всех ячейках есть поле foodAmountField, и вы сказали им установить для текста значение вашего степпера. Чтобы исправить это, вам нужно «поле» в вашем источнике данных, чтобы отслеживать значения в метке. В зависимости от того, как сейчас выглядит ваш источник данных для ваших ячеек, это «поле» может быть парой ключ-значение в словаре, при этом ваш источник данных представляет собой массив словарей. В методе действия вашего степпера вы должны получить indexPath ячейки, в которой находится степпер, и использовать это значение для обновления правильной записи в вашем массиве словарей. Именно так всегда работают табличные представления — они предназначены для отображения значений, а не для их хранения.

person rdelmar    schedule 17.11.2013
comment
Позвольте мне проверить, правильно ли я вас понял: ячейки моего табличного представления содержат данные из объектов Meal. Вы предлагаете, чтобы мой класс Meal содержал свойство для хранения значения этого поля (например, количество), и когда я изменяю значение шагового двигателя, это свойство должно измениться (и затем я должен обновить ячейку представления таблицы с новым блюдом) ? - person József Vesza; 17.11.2013
comment
Я обновил свой код на основе вашего предложения, добавил детали в свой исходный вопрос. - person József Vesza; 17.11.2013
comment
@ jv0521, так вы говорите, что когда вы меняете значение шагового двигателя в одной ячейке, его значение изменяется на значение во всех других ячейках? - person rdelmar; 17.11.2013
comment
ваше предложение было идеальным, я понял, в чем была ошибка: я добавил следующее в метод cellForRowAtIndexPath: cell.mealAmountStepper.value = currentMeal.amount;, так что теперь он устанавливает степпер на правильное значение ячейки. - person József Vesza; 17.11.2013