UITableView, цвет текста определенной ячейки с помощью indexpath.row == ..., Цвета больше чем одна ячейка - PullRequest
0 голосов
/ 08 сентября 2011

Я не могу понять, что здесь происходит и почему.Я идентифицирую определенный индекс, на который я хочу нацелиться, чтобы изменить цвет.А внутри:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

Я запускаю следующее:

if ([savedPRIndex intValue] == indexPath.row) {
        [customCell togglePR:TRUE];
        NSLog(@"TRUE");
    }else{
        [customCell togglePR:FALSE];
    }

В пользовательской ячейке

- (void)layoutSubviews{

    [super layoutSubviews];
    CGFloat xPosition = 20.0f; // Default text position

    if(prToggle){
        xPosition = -20.0f;
        cellText.textColor = [UIColor colorWithRed:0x24/255.0 green:0x9e/255.0 blue:0xd6/255.0 alpha:1.0];       
        UIImage* img = [UIImage imageNamed:@"pr_icon.png"];
        CGRect rect = CGRectMake(272.0f, 14.0f, img.size.width/2, img.size.height/2);
        UIImageView* imgView = [[UIImageView alloc] initWithFrame:rect];
        [imgView setImage:img];

        [self addSubview:imgView];
        [imgView release];
    }

    CGRect textLabelFrame = self.cellText.frame;
    textLabelFrame.origin.x = xPosition;
    self.cellText.frame = textLabelFrame;
}

-(void)togglePR:(BOOL)TF{
    prToggle = TF;
}

Пользовательская ячейкаместо, где текст может изменить цвет, у кого-нибудь есть идеи?

Я могу выложить больше кода, если это поможет расшифровать происходящее.

Дополнительный код

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    static NSString *CellIdentifier = @"Cell";

    CustomCell *customCell = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (customCell == nil) {
        customCell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }

    NSLog(@"savedPRIndex : %@", savedPRIndex);
    NSLog(@"Index Path : %i", indexPath.row);

    [customCell togglePR:[savedPRIndex intValue] == indexPath.row];

    // Configure the cell...
    customCell.cellText.text = [[toShow objectAtIndex:indexPath.row] objectForKey:@"Value"];
    customCell.cellPower.text = [[toShow objectAtIndex:indexPath.row] objectForKey:@"PowerValue"];
    customCell.cellSplit.text = [[toShow objectAtIndex:indexPath.row] objectForKey:@"Split"];

    return customCell;
}

Ответы [ 2 ]

1 голос
/ 08 сентября 2011

Где ваше второе заявление?Если это происходит при первоначальном создании ячейки, это может привести к установке нескольких ячеек при повторном использовании ячейки.Ваш cellForRowAtIndexPath должен иметь следующую структуру:

  • удалить ячейку из очереди
  • проверить, был ли возвращен объект ячейки, инициализировать новый, если нет
  • настроить ячейку (либоячейка в удаленном состоянии или только что созданная ячейка)

Я предполагаю, что ваш код выше находится в части 2, а не в части 3.

РЕДАКТИРОВАТЬ: только что увидел ваш обновленный код.После того, как вы установили переключатель, у вас, кажется, нет механизма для его отмены - например, удалить созданное подпредставление и так далее.Вы можете убирать ячейку с установленным переключателем, но установка в NO не имеет никакого эффекта.

0 голосов
/ 08 сентября 2011

Скорее всего, вы не показали нам достаточно кода, и у вас есть этот код в проверке if(!cell) при попытке удалить из очереди ячейку.Это означает, что он будет запущен только для первоначального создания ячейки, а не для удаленных ячеек.

Теперь отметим, что в Objective-C вместо TRUE и FALSE используются YES и NO, и когда вам нужно установить логическое значение, нет необходимости использовать проверку ifпотому что логическое выражение будет работать.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableview dequeue...:@"blah"];
    if(!cell)
    {
        //Create cell
        //Do not set the colors here
    }

    //Set the colors here (no need for an if check)
    [customCell togglePR:[savedPRIndex intValue] == indexPath.row];
}

Редактировать:

В зависимости от вашего обновления вы должны вызвать - (void)setNeedsLayout или - (void)setNeedsDisplay, когда вы установите флаг PR.

-(void)togglePR:(BOOL)TF{
    prToggle = TF;
    [self setNeedsDisplay];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...