当UITableViewCell被选中/突出显示时,从NSAttributedString更改文本颜色

时间:2014-03-11 07:53:37

标签: ios objective-c uitableview nsattributedstring

我希望能够在点击(选中/突出显示)时更改UITableView单元格中的文本。每个单元格的内容都来自NSAttributedString。这是代码:

-(NSAttributedString*)formattedSubject:(int)state {
    if(formattedSubject!=nil) return formattedSubject;
    NSDictionary *boldStyle = [[NSDictionary alloc] init];
    if(state==1) {
        boldStyle = @{NSFontAttributeName:[UIFont fontWithName:@"Helvetica-Bold" size:16.0],NSForegroundColorAttributeName:[UIColor colorWithRed:0.067 green:0.129 blue:0.216 alpha:1.0]};
    }
    else {
        boldStyle = @{NSFontAttributeName:[UIFont fontWithName:@"Helvetica-Bold" size:16.0],NSForegroundColorAttributeName:[UIColor whiteColor]};
    }
    NSDictionary* normalStyle = @{NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:14.0]};
    NSMutableAttributedString* articleAbstract = [[NSMutableAttributedString alloc] initWithString:subject];
    [articleAbstract setAttributes:boldStyle range:NSMakeRange(0, subject.length)];
    [articleAbstract appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n"]];
    int startIndex = [articleAbstract length];
    NSTimeInterval _interval=[datestamp doubleValue];
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:_interval];
    NSDateFormatter *_formatter=[[NSDateFormatter alloc]init];
    [_formatter setDateFormat:@"MM/dd/yy"];
    NSString* description = [NSString stringWithFormat:@"By %@ on %@",author,[_formatter stringFromDate:date]];
    [articleAbstract appendAttributedString:[[NSAttributedString alloc] initWithString: description]];
    [articleAbstract setAttributes:normalStyle range:NSMakeRange(startIndex, articleAbstract.length - startIndex)];
    formattedSubject = articleAbstract;
    return formattedSubject;
}

如您所见,我希望boldStyle文本在状态为“1”时为某种颜色(由[UIColor colorWithRed:0.067 green:0.129 blue:0.216 alpha:1.0]给出),否则为白色。我目前在cellForRowAtIndexPath以及didSelectRowAtIndexPath

中尝试了以下修改

的cellForRowAtIndexPath:

NSIndexPath *path = [tableView indexPathForSelectedRow];
if(path) {
    cell.textLabel.attributedText = [news formattedSubject:1];
}
else {
    cell.textLabel.attributedText = [news formattedSubject:0];
}

我在这里做的是检查是否选择了一个单元格,如果是,那么我将该单元格的“attributedText”更改为“0”格式。但是,这不起作用,我怀疑这是因为必须在实际选择单元格时进行修改。所以我在didSelectRowAtIndexPath中尝试了以下内容:

didSelectRowAtIndexPath方法:

News *news = newsArray[indexPath.row];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
cell.textLabel.attributedText = [news formattedSubject:0];

然而,似乎永远不会改变。我在NSLog if / else语句的“else”部分放了一个boldStyle,它从未写入控制台。

我对解决方案的尝试都没有奏效,而且我已经没有想法了。如何突出显示单元格时如何更改NSAttributedString

更新:有趣的是normalStyle文字,默认情况下为黑色, 在我添加{时突出显示/选中单元格时变为白色{1}}中的{1}},但cell.textLabel.highlightedTextColor = [UIColor whiteColor];文字没有。{/ p>

2 个答案:

答案 0 :(得分:1)

我有同样的问题,而且......

cell.textLabel.enable = NO;

刚刚解决了

答案 1 :(得分:0)

cellForRowAtIndexPath 方法中,您正在检查此tableView中是否存在selectedIndexPath。

NSIndexPath *path = [tableView indexPathForSelectedRow];
if(path) {

我认为您想要比较indexPath和selectedIndexPath。你应该使用isEqual:为此。

NSIndexPath *selectedIndexPath = [tableView indexPathForSelectedRow];
if([selectedIndexPath isEqual:indexPath]) {