Изменение цвета кнопки в UITableviewCell

Я пытаюсь изменить цвет кнопки при нажатии, которая находится в tableviewCell. Однако мой код меняет цвет каждой кнопки в таблице, а не только той, что находится в выбранной мной ячейке,

Как бы мне просто изменить цвет кнопки, которую я нажал.

Пожалуйста, посмотрите мой код ниже,

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    UIButton *addNotesButton = (UIButton *)[cell viewWithTag:106];
    [addNotesButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Test";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    UIButton *addNotesButton = (UIButton *)[cell viewWithTag:106];/
    [addNotesButton addTarget:self action:@selector(addNotes :) forControlEvents:UIControlEventTouchUpInside];
}

person Mich    schedule 26.06.2015    source источник


Ответы (3)


Основная проблема может заключаться в вашем cellForRowAtIndexPath: методе. UITableView ячейки используются повторно по мере их отображения на экране. dequeueReusableCellWithIdentifier: метод возвращает ячейку, если она была помечена как готовая к повторному использованию. Вы, должно быть, видели, что этот метод UITableView используется в cellForRowAtIndexPath: методе. (См. Эту ссылку)

Таким образом, в cellForRowAtIndexPath: вам придется настраивать каждую ячейку по мере ее загрузки, иначе она будет отображать старые значения (поскольку ячейки используются повторно).

Вы можете объявить свойство или простую переменную типа NSIndexPath. Позвольте переменной называться _selectedIndexPath. Затем в didSelectRowAtIndexPath: вы можете назначить это свойство выбранному indexPath.

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSArray *indexPaths = nil;
    if (_selectedIndexPath) {
        indexPaths = @[_selectedIndexPath, indexPath];
    } else {
        indexPaths = @[indexPath];

    }
    _selectedIndexPath = indexPath;
    [tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
}

- (void)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Your Cell Identifier"];
    UIButton *addNotesButton = (UIButton *)[cell viewWithTag:106];

    if (indexPath.row == _selectedIndexPath.row) {
        [addNotesButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    } else {
        [addNotesButton setTitleColor:[UIColor clearColor] forState:UIControlStateNormal];
    }
}
person tek3    schedule 26.06.2015
comment
Привет, спасибо за ответ. У меня проблема, когда indexPath.row == _selectedIndexPath.row всегда равняется настройке моих кнопок на синий всегда. - person Mich; 29.06.2015
comment
Он по-прежнему меняет цвет всех кнопок вместо кнопки, которую я нажимаю. - person Mich; 29.06.2015
comment
@Mich: Не могли бы вы предоставить код, который вы используете? Трудно сказать, что может пойти не так, не видя кода. - person tek3; 29.06.2015
comment
Привет, tek3 Я редактировал вопрос своим кодом. См. Выше. - person Mich; 01.07.2015
comment
Привет, tek3 Я внес изменения, но все кнопки становятся синими, хотя я нажимаю только одну. : / - person Mich; 02.07.2015
comment
Мне пришлось использовать другой подход. - person Mich; 03.07.2015

Вам не нужно изменять цвет вручную, если выбрана строка в пути индекса. Просто установите цвет для UIControlStateSelected и при нажатии кнопки установите для свойства button selected значение YES. Из вашего кода я думаю, что это должно сработать.

внутри ячейки для строки в методе индексного пути

 [addNotesButton setTitleColor:[UIColor blueColor] forState:UIControlStateSelected];

и в методе действия кнопки

-(IBAction)addNotes:(id)sender
{
    UIButton *button = (UIButton*)sender;
    buttons.selected = !button.isSelected;
}

Думаю, это сработает.

person Mahesh Agrawal    schedule 01.07.2015
comment
Это дает тот же результат, что и мой исходный код. Все кнопки меняют цвет, когда я хочу, чтобы меняла только кнопка, которую я выбрал. - person Mich; 02.07.2015

После все перепробовал и не получилось. У меня в каждой строке появилось скрытое значение, которое будет меняться при нажатии кнопки. Таким образом, код считывает значение, а затем настраивает кнопку для каждой строки.

person Mich    schedule 03.07.2015