#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, а затем сравнить, существует он или нет.