更改自定义 UITableViewCell iphone中的文本颜色
Posted
技术标签:
【中文标题】更改自定义 UITableViewCell iphone中的文本颜色【英文标题】:changing text color in custom UITableViewCell iphone 【发布时间】:2010-05-19 00:58:11 【问题描述】:我有一个自定义单元格,当用户选择该单元格时,我希望两个 UILabel 中的文本变为浅灰色。
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
【问题讨论】:
【参考方案1】:由于您使用的是自定义表格单元格,因此您可以通过在自定义 UITableViewCell 中实现 setSelected 和 setHighlighted 方法来实现代码来设置标签颜色。这将捕获选择的所有状态更改,尽管有一些棘手的情况,例如当您选择并在已选择单元格后拖动到单元格外部时使用 NO 调用 setHighlighting。这是我使用的方法,我相信在所有情况下都可以适当地设置颜色。
- (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];
【讨论】:
【参考方案2】:在您的didSelectRowAtIndexPath
方法中,调用以获取当前单元格并进行相应更新:
CheckListCell* theCell = (CheckListCell*)[tableView cellForRowAtIndexPath:indexPath];
theCell.nameLabel.textColor = [UIColor lightGrayColor];
theCell.colorLabel.textColor = [UIColor lightGrayColor];
【讨论】:
这很好用,除了当我滚动离开修改过的单元格,然后向后滚动时,单元格又回到了它的原始状态。所以我假设我必须跟踪哪些单元格在其他地方被修改?我猜要保留一个已修改的 indexPaths 数组,然后在 cellForRowAtIndexPath 方法中检查该索引路径的数组?还是有更简单的方法? 当然,现在我正在尝试这样做,我认为没有简单的方法来比较两个 indexPaths.... 是的,您确实应该同时更新您的数据源。我所描述的实际上只是为了获得即时视觉更新。我假设您有一个对象数组,您将其用作表的数据源?您可以向对象添加一个属性以定义它是否被选中,在 didSelectRowAtIndexPath 方法(以及上面的代码)中更新它,并使用它来确定 cellForRowAtIndexPath 方法中的 textColor。希望这很清楚! 是的,这很清楚,但是对于这个表,如果不重做所有事情,我就不能像这样对数据源做任何事情。相反,我制作了一系列索引路径,并创建了一个循环,将索引路径与该数组中的所有索引路径进行比较。不确定这是否可行。当我尝试向 mutablearray 添加索引路径时,没有任何反应,并且显示数组内容的 NSLOG 始终显示 null,即使在据称成功的 addObject:indexPath] 之后也是如此。是不可能将索引路径添加到数组中还是我只是做错了什么(再次,大声笑) 你分配/初始化数组了吗?【参考方案3】:在tableView:didSelectRowAtIndexPath:
中记录选定单元格的索引路径。在tableView:cellForRowAtIndexPath:
中,只需检查它是否与您保存的索引路径匹配,并相应地设置文本颜色。我不完全确定单元格是否在选择后重新绘制,因此您可能需要在选择后reloadData
,但如果您正在缓存单元格/遵循正常的单元格绘制最佳实践,它应该足够快。
或者使用reloadRowsAtIndexPaths:withRowAnimation
和UITableViewRowAnimationNone
。但是您需要跟踪最后一个以灰色文本绘制的单元格,并以普通样式重新绘制它。
【讨论】:
【参考方案4】:我的排序方式是在“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]];
【讨论】:
正如你所看到的,当我循环浏览时,我检查了子视图是否是 UITableViewCell 的一种,如果是,则只更改颜色。希望这会有所帮助!【参考方案5】:很简单,你只需要使用this(below)方法,这里我设置备用单元格颜色
-(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 属性..
【讨论】:
以上是关于更改自定义 UITableViewCell iphone中的文本颜色的主要内容,如果未能解决你的问题,请参考以下文章
在运行时无法更改和自定义自定义 UITableViewCell 中的 UIButtons 的标题
更改自定义 UITableViewCell iphone中的文本颜色
iOS:在自定义 UITableViewCell 中更改 contentView backgroundColor on touchDown