2010-05-19 4 views
4

У меня есть пользовательская ячейка, и когда пользователь выбирает эту ячейку, я бы хотел, чтобы текст в двух UILabels изменился на светло-серый.изменение цвета текста в пользовательском UITableViewCell iphone

ChecklistCell.h:

#import <UIKit/UIKit.h> 


@interface ChecklistCell : UITableViewCell { 
    UILabel *nameLabel; 
    UILabel *colorLabel; 
    BOOL selected; 


} 

@property (nonatomic, retain) IBOutlet UILabel *nameLabel; 
@property (nonatomic, retain) IBOutlet UILabel *colorLabel; 



@end 

ChecklistCell.m:

#import "ChecklistCell.h" 


@implementation ChecklistCell 
@synthesize colorLabel,nameLabel; 
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) { 
     // Initialization code 
    } 
    return self; 
} 


- (void)setSelected:(BOOL)selected animated:(BOOL)animated { 

    [super setSelected:selected animated:animated]; 

    // Configure the view for the selected state 
} 


- (void)dealloc { 
    [nameLabel release]; 
    [colorLabel release]; 
     [super dealloc]; 
} 


@end 

ответ

5

В вашем методе didSelectRowAtIndexPath, сделать вызов, чтобы получить текущую ячейку и обновить соответственно:

CheckListCell* theCell = (CheckListCell*)[tableView cellForRowAtIndexPath:indexPath]; 
theCell.nameLabel.textColor = [UIColor lightGrayColor]; 
theCell.colorLabel.textColor = [UIColor lightGrayColor]; 
+0

Это работает отлично, за исключением случаев, когда я прокручиваю прочь от измененных ячеек, а затем прокручиваю назад, ячейка возвращается в исходное состояние. Поэтому я предполагаю, что мне нужно отслеживать, какие ячейки модифицированы в другом месте? Im, угадывая, чтобы сохранить массив indexPaths, которые были изменены, то в методе cellForRowAtIndexPath он проверит массив для этого пути индекса? Или есть какой-то способ? – Brodie

+0

и, конечно, теперь, когда я пытаюсь сделать это, я не могу легко сравнивать два индекса. – Brodie

+0

Да, вы действительно должны обновлять свой источник данных одновременно. То, что я описал, действительно только для получения мгновенного визуального обновления. Я предполагаю, что у вас есть массив объектов, которые вы используете в качестве источника данных для таблицы?Вы можете добавить свойство к объекту, чтобы определить, выбрано оно или нет, обновите его в методе didSelectRowAtIndexPath (а также код выше) и используйте его для определения textColor в методе cellForRowAtIndexPath. Надеюсь, это ясно! –

0

В tableView:didSelectRowAtIndexPath: записи индекс путь выбранной ячейки. В tableView:cellForRowAtIndexPath: просто проверьте, соответствует ли он вашему сохраненному пути указателя, и соответствующим образом задайте цвет текста. Я не совсем уверен, если ячейка будет перерисована после выбора, поэтому вам может понадобиться reloadData следующий выбор, но он должен быть достаточно быстрым, если вы кешируете ячейки/следуете нормальной практике рисования клеток.

Или используйте reloadRowsAtIndexPaths:withRowAnimation с UITableViewRowAnimationNone. Но тогда вам нужно будет следить за последней ячейкой, которую вы нарисовали серым текстом, и перерисовать ее в простом стиле.

0

Путь я отсортированный это было в «didSelectRowAtIndexPath:» петлю через все подвидов из Tableview и установить весь текст ярлыки по умолчанию:

for(CustomTableViewCell *tableCell in [tableView subviews]) { 
    if([tableCell isKindOfClass:[UITableViewCell class]]) { 
     [tableCell.textLabel setTextColor: [UIColor blackColor]]; 
    } 
} 

.... затем установите выбранную ячейку таблицы в белый цвет.

[[tableView cellForRowAtIndexPath:indexPath].textLabel setTextColor: [UIColor whiteColor]]; 
+0

Как вы можете видеть, когда я зациклился, я проверил, было ли subview видным UITableViewCell и только изменил цвет, если это было. Надеюсь это поможет! – jodm

13

Поскольку вы используете ячейку пользовательской таблицы, вы можете реализовать код, чтобы установить цвета меток путем реализации setSelected и setHighlighted методы в пользовательских UITableViewCell. Это приведет к захвату всех изменений состояния из выбора, хотя есть некоторые сложные случаи, например, когда setHighlighting вызывается с NO, когда вы выбираете и перетаскиваете за пределы ячейки после того, как она уже была выбрана. Вот подход, который я использовал, который, по моему мнению, правильно устанавливает цвет во всех случаях.

- (void)updateCellDisplay { 
    if (self.selected || self.highlighted) { 
     self.nameLabel.textColor = [UIColor lightGrayColor]; 
     self.colorLabel.textColor = [UIColor lightGrayColor]; 
    } 
    else { 
     self.nameLabel.textColor = [UIColor blackColor]; 
     self.colorLabel.textColor = [UIColor blackColor]; 
    } 
} 

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { 
    [super setHighlighted:highlighted animated:animated]; 
    [self updateCellDisplay]; 
} 

- (void) setSelected:(BOOL)selected animated:(BOOL)animated { 
    [super setSelected:selected animated:animated]; 
    [self updateCellDisplay]; 
} 
0

Это очень просто, Вам просто нужно использовать этот метод (ниже), здесь я устанавливаю альтернативный цвет ячейки

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row%2 == 0) 
    { 
     tCell.cellLabel.textColor = [UIColor grayColor]; 
    } 
    else 
    { 
     tCell.cellLabel.textColor = [UIColor blackColor]; 
    } 
} 

PS- нет необходимости использовать cellForRowAtIndexPath: метод для изменения cellText Propties ..

Смежные вопросы