uitableview загружает ячейки с содержимым предыдущих ячеек - PullRequest
0 голосов
/ 24 ноября 2010

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

как это решить ...?

спасибо.

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil) 
        cell = [[[UITableViewCell alloc] initWithFrame:CellFrame reuseIdentifier:CellIdentifier] autorelease];
    for(UIView *v in [cell.contentView subviews])
        [v removeFromSuperview];

        curCellNo = indexPath.row;
        if(curCellNo == 0){
            min = 0;
            max = 8;
            x=0;
            y=yForFirst;
            col = 1;
        }else{ 
            if(curCellNo < prevCellNo){
                min = min-12;
                max = max-12;

            }else{
                min = max;
                max = min+12;
            }
            x=0;
            y=0;
        }
        prevCellNo = curCellNo;
        NSLog(@"Max...%d",max);
        NSLog(@"Min...%d",min);
        NSLog(@"songsCount...%d",[songs count]);

        for(int i=min; i<max && i<[songs count]; i++){

            Song *thesong = [self.songs objectAtIndex:i];
            CGRect frame;
            frame.size.width=coverWidth; frame.size.height=coverHeight;
            frame.origin.x=x; frame.origin.y=y;

            LazyImageView* asyncImage = [[[LazyImageView alloc] initWithFrame:frame]autorelease];
            NSURL* url = [NSURL URLWithString:thesong.cover];
            [asyncImage loadImageFromURL:url];

            UILabel *label = [[[UILabel alloc]initWithFrame:CGRectMake(x, y+artistLabelYPos, artistLabelWidth, artistLabelHeight)]autorelease];
            label.text = [thesong.title stringByAppendingString:[@"\nby " stringByAppendingString:thesong.artist]];
            [label setTextAlignment:UITextAlignmentLeft];
            label.numberOfLines = 0;
            label.font = [UIFont systemFontOfSize:artistLabelFontSize];
            label.textColor = [UIColor whiteColor];
            label.backgroundColor = [UIColor darkTextColor];
            label.alpha = 0.75;

            UIButton *playBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            playBtn.frame = CGRectMake(x+playBtnXPos, y+playBtnYPos, playBtnWidth, playBtnHeight); 
            [playBtn addTarget:self action:@selector(playBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
            if(playingButton && streamer){
                if(playingButtonTag == i && [streamer isPlaying]){
                    [playBtn setBackgroundImage:[UIImage imageNamed:pauseBtnimgName] forState:UIControlStateNormal];
                    playingButton = playBtn;
                }else [playBtn setBackgroundImage:[UIImage imageNamed:playBtnimgName] forState:UIControlStateNormal];
            }else [playBtn setBackgroundImage:[UIImage imageNamed:playBtnimgName] forState:UIControlStateNormal];


            playBtn.tag = i;
            [cell.contentView addSubview:asyncImage];
            [cell.contentView addSubview:label];
            [cell.contentView addSubview:playBtn];
            label = nil;
            asyncImage = nil;



            if(curCellNo == 0){
                y += estCoverHeight;
                if(y>=(estCoverHeight*noOfRowsInCell)){
                    col++;
                    x += estCoverWidth;
                    if(col>=3)
                        y=0;
                    else 
                        y=yForFirst;
                }   
            }else{
                col =3;
                y += estCoverHeight;
                if(y>=(estCoverHeight*noOfRowsInCell)){

                    x += estCoverWidth;
                    y=0;
                }
            }

        }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.contentView.transform = CGAffineTransformMakeRotation(M_PI/2);
    return cell; 
}

Ответы [ 4 ]

2 голосов
/ 24 ноября 2010

Это потому, что вы никогда не устанавливаете содержимое повторно используемого UITableViewCell

Вы предоставляете конетент только тогда, когда (ячейка == ноль) и новая ячейка выделяется

1 голос
/ 25 ноября 2010

Я сделал эту ошибку - как только вы сделаете это и исправите один раз, вы никогда не забудете:)

Экземпляры UITableViewCell кэшируются по соображениям производительности. Класс UITableView обрабатывает все это для вас. Он в основном кэширует достаточно экземпляров, чтобы охватить полноэкранную ячейку плюс несколько ячеек. Это означает, что таблица с 100 строками будет работать с тем же числом экземпляров, что и таблица с 1000 строками.

Это означает, что вы несете ответственность за обновление содержимого по мере его появления.

(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath вызывается при запросе ячейки. В вашей реализации:

if(cell == nil) {
    // Instantiate the UITableViewCell here
    // Perform operations that need to occur on every cell, regardless of content
} 

// Out here, perform content assignments

Надеюсь, это прояснит некоторые вещи. В основном вам просто нужно сместить большую часть кода, который находится внутри условного, за пределы условного. Тем не менее, я не потворствую вашему использованию кода. Вы действительно должны реализовать пользовательскую ячейку. Это проще, чем то, что вы делаете:)

1 голос
/ 24 ноября 2010

Вы не очищаете содержимое ячейки при ее повторном использовании.Это программирование UITableView 101. Пожалуйста, есть видео WWDC, видео Стэнфорда на iTunesU, которые вы должны смотреть, руководства по программированию таблиц в тексте, если хотите, все, что касается повторного использования ячеек.

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

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

0 голосов
/ 15 мая 2013

просто попробуйте это

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];

Это сработало для меня. У меня был UITableView с составными ячейками. Я также столкнулся с теми же проблемами.

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