UITableViewCell из cellForRowAtIndexPath имеет подпредставление не обновляется - PullRequest
0 голосов
/ 16 октября 2011

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIView *left;
    UIImageView *leftImage;
    UILabel *label;
    ArticleButton *btn;

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
    if (!cell)
    {
        cell = [[[UITableViewCell alloc]
                 initWithStyle:UITableViewCellStyleSubtitle 
                 reuseIdentifier:@"UITableViewCell"] autorelease];

        left = [[[UIView alloc] initWithFrame:CGRectMake(0, 2, 155, 139)] autorelease];
        leftImage = [[[UIImageView alloc] initWithFrame:CGRectMake(7,9,141,77)] autorelease];
        label = [[[UILabel alloc] initWithFrame:CGRectMake(6,87,141,48)] autorelease];
        btn = [[[ArticleButton alloc] initWithFrame:CGRectMake(0,2,155,139)] autorelease];

        left.tag = 0;
        leftImage.tag = 1;
        label.tag = 2;
        btn.tag = 3;

        [btn addTarget:self action:@selector(selectArticle:) forControlEvents:UIControlEventTouchUpInside];

        [cell.contentView addSubview:left];
        [cell.contentView addSubview:leftImage];    
        [cell.contentView addSubview:label];
        [cell.contentView addSubview:btn];
    }
    else
    {
        left = (UIView*)[cell viewWithTag:0];
        leftImage = (UIImageView*)[cell viewWithTag:1];
        label = (UILabel*)[cell viewWithTag:2];
        btn = (ArticleButton*)[cell viewWithTag:3];
    }

...load *entry


    NSURL *url = [NSURL URLWithString:[entry imageUrl]];

    FeedEntry* selectedEntry = [detailViewController detailItem];
    NSString* selectedTitle = selectedEntry.title;



    if ([selectedTitle isEqualToString:entry.title])
    {       
        [left setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"cellbackground_sel.png"]]];  <-- PROBLEM IS THIS IMAGE NEVER CHANGES
        NSLog(@"selected row %@", selectedTitle);
    }
    else{
        [left setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"cellbackground2.png"]]];
    }           

    [left setNeedsDisplay];

    [leftImage setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder.gif"]];
    [leftImage setContentMode:UIViewContentModeScaleAspectFill];
    leftImage.clipsToBounds = YES;

       [label setBackgroundColor:[UIColor clearColor]];
    label.textColor = [UIColor whiteColor];
    label.text  = [entry.title stringByAppendingString:@"\n\n"];
    label.numberOfLines  = 3;
    label.lineBreakMode = UILineBreakModeClip;
    label.font = [UIFont fontWithName:@"Arial-BoldMT" size:12];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;


    return cell;
}

Проблема, с которой я столкнулся, связана с этим разделом:

if ([selectedTitle isEqualToString:entry.title])
    {       
        [left setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"cellbackground_sel.png"]]];
        NSLog(@"selected row %@", selectedTitle);
    }
    else{
        [left setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"cellbackground2.png"]]];
    }           

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

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

Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 16 октября 2011

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

viewWithTag:

Возвращаемое значение
Представление в иерархии получателя, свойство тега которого соответствует значению параметра тега.

Обсуждение
Этот метод ищет текущее представление и все его подпредставления для указанного представления.

Если вы считаете, что тег большинства представлений равен нулю, даже тег текущего представления ячейки. Я думаю, что вы не получаете правильный взгляд из этого. Старайтесь не использовать 0 в качестве тега для работы.

0 голосов
/ 16 октября 2011

Вместо установки этого в tableview:cellForRowAtIndexPath:, попробуйте сделать это в tableview:willSelectRowAtIndexPath:

Подробнее см. Протокол .

0 голосов
/ 16 октября 2011

Всякий раз, когда выбирается конкретный UITableViewCell, этот конкретный делегат называется -

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

Попробуйте проверить, реагируют ли нажатия на кнопки в первый разэтим делегатом вместо того, чтобы идти к selectArticle: селектору, который вы определили ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...