Измените цвет UILabel внутри ячейки таблицы при нажатии на ячейку

#ios #objective-c #uitableview #uilabel

#iOS #objective-c #uitableview #uilabel

Вопрос:

У меня есть ячейка с UIImage и UILabel внутри нее:

введите описание изображения здесь

У меня есть этот код для настройки ее содержимого, довольно стандартный материал:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *itemCellID = @"menuItem";

    NSString *currentMenuLabel = [self.menuItemStructure objectAtIndex:[indexPath row]];
    NSString *currentMenuIcon = [self.menuItemIcon objectAtIndex:[indexPath row]]; 
    MTNLeftMenuItemCell *cell = [self.tableView dequeueReusableCellWithIdentifier:itemCellID];
    [cell.leftMenuItemLabel setText:currentMenuLabel];
    UIImage *icon = [UIImage imageNamed:currentMenuIcon];
    [cell.leftMenuItemIcon setImage:icon];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return cell;
}
  

Теперь то, что я хочу сделать, это изменить этот UILabel's цвет текста при нажатии на ячейку, вроде как .cell .label:hover { ... } в css. Оглядываясь назад, это кажется довольно очевидным, но UILabel меня смущает то, что это вложенное представление ячейки.

Как я могу это сделать?

Комментарии:

1. Поскольку вы, похоже, используете пользовательский UITableViewCell , как насчет перезаписи setSelected:animated: ?

Ответ №1:

Существует didSelectRowAtIndexPath метод делегирования, вызываемый при выборе ячейки

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{
   UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; //Get your cell for selected row       
   cell.leftMenuItemLabel.textColor = [UIColor redColor];//Configure whatever color you want
}
  

Комментарии:

1. Как это будет работать при повторном использовании ячейки? каждый раз, когда вы прокручиваете табличный вид, это может привести к созданию новой ячейки. таким образом, ваш цвет не будет установлен.

2. Просто измените идентификатор на NSString * identifier = [NSString stringWithFormat:@»Cell_%d_%d»,indexPath.row,indexPath.section];

3. @Vijay-Apple-Dev.blogspot.com OP не упомянул такое требование, что оно должно быть сохранено как есть 🙂 он просто спросил о назначении цвета при выборе строки.

Ответ №2:

Ответ Джанака Нирмала позаботьтесь только о выделении в точке. если вы хотите сделать цвет метки ячейки постоянным, вам следует отслеживать ячейку с помощью indexPath или каким-либо другим способом.

Каждый раз, когда вы прокручиваете табличный вид, это может привести к созданию новой ячейки. таким образом, ваш цвет не будет установлен.

Таким образом, вам нужно сравнить indexPath выбранной ячейки и изменить цвет метки новой ячейки.

.h

 @property (retain, nonatomic) NSIndexPath *selectedIndexPath;
  

.m

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *itemCellID = @"menuItem";

    NSString *currentMenuLabel = [self.menuItemStructure objectAtIndex:[indexPath row]];
    NSString *currentMenuIcon = [self.menuItemIcon objectAtIndex:[indexPath row]];
    MTNLeftMenuItemCell *cell = [self.tableView dequeueReusableCellWithIdentifier:itemCellID];
    [cell.leftMenuItemLabel setText:currentMenuLabel];
    UIImage *icon = [UIImage imageNamed:currentMenuIcon];
    [cell.leftMenuItemIcon setImage:icon];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    if (self.selectedIndexPath amp;amp; [indexPath compare:self.selectedIndexPath] == NSOrderedSame){

        [self decorateSelectedLabel:cell];
    }
    return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; //Get your cell for selected row
    self.selectedIndexPath = indexPath;
    [self decorateSelectedLabel:cell];
}
- (void)decorateSelectedLabel:(MTNLeftMenuItemCell*)selectedCell{
    selectedCell.leftMenuItemLabel.textColor = [UIColor redColor];//Configure whatever color you want
}
  

Если у вас есть множественный выбор в ячейках, тогда у вас есть массив для сохранения индекса. Удачи

Комментарии:

1. Этот подход не рекомендуется, поскольку это будет проблематично, когда OP захочет сохранить цвет выделения нескольких строк. Вы должны сохранить indexpath в array, а затем сравнить, существует он или нет.