2010-05-27 3 views
1

У меня есть UITableView, который повторно использует ячейки, когда пользователь прокручивает. Все появляется и прокручивается отлично, за исключением случаев, когда пользователь нажимает на фактическую строку, выделенная ячейка отображает текст из другой ячейки. Я не совсем уверен, почему.Проблема с повторным использованием UITableViewCell's

#define IMAGE_TAG 1111 
#define LOGIN_TAG 2222 
#define FULL_NAME_TAG 3333 

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    STUser *mySTUser = [[[STUser alloc]init]autorelease]; 
    mySTUser = [items objectAtIndex:indexPath.row]; 

    AsyncImageView* asyncImage = nil; 
    UILabel* loginLabel = nil; 
    UILabel* fullNameLabel = nil; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    else { 
     asyncImage = (AsyncImageView *) [cell.contentView viewWithTag:IMAGE_TAG]; 
     loginLabel = (UILabel *) [cell.contentView viewWithTag:LOGIN_TAG]; 
     fullNameLabel = (UILabel *) [cell.contentView viewWithTag:FULL_NAME_TAG]; 
    } 

    // Configure the cell... 

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    CGRect frame = CGRectMake(0, 0, 44, 44); 
    asyncImage = [[[AsyncImageView alloc]initWithFrame:frame] autorelease]; 
    asyncImage.tag = IMAGE_TAG; 
    NSURL* url = [NSURL URLWithString:mySTUser.avatar_url_large]; 
    [asyncImage loadImageFromURL:url]; 
    [cell.contentView addSubview:asyncImage]; 

    loginLabel.tag = LOGIN_TAG; 
    CGRect loginLabelFrame = CGRectMake(60, 0, 200, 10); 
    loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease]; 
    loginLabel.text = [NSString stringWithFormat:@"%@",mySTUser.login]; 
    [cell.contentView addSubview:loginLabel]; 

    fullNameLabel.tag = FULL_NAME_TAG; 
    CGRect fullNameLabelFrame = CGRectMake(60, 20, 200, 10); 
    fullNameLabel = [[[UILabel alloc] initWithFrame:fullNameLabelFrame] autorelease]; 
    fullNameLabel.text = [NSString stringWithFormat:@"%@ %@",mySTUser.first_name, mySTUser.last_name]; //[NSString stringWithFormat:@"%@",mySTUser.login]; 
    [cell.contentView addSubview:fullNameLabel];  


    return cell; 
} 

ответ

6

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

STUser *mySTUser = [[[STUser alloc]init]autorelease]; 
mySTUser = [items objectAtIndex:indexPath.row]; 

Вместо этого просто объявите переменную и используйте ее.

STUser *mySTUser; 
mySTUser = [items objectAtIndex:indexPath.row]; 

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

asyncImage = [[[AsyncImageView alloc]initWithFrame:frame] autorelease]; 
[cell.contentView addSubview:asyncImage]; 

Вместо этого поместите все строки addSubview в условие if, где создана ячейка.

if (cell == nil) { 
    CGRect frame = CGRectMake(0, 0, 44, 44); 
    CGRect loginLabelFrame = CGRectMake(60, 0, 200, 10); 
    CGRect fullNameLabelFrame = CGRectMake(60, 20, 200, 10); 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    asyncImage = [[[AsyncImageView alloc]initWithFrame:frame] autorelease]; 
    [cell.contentView addSubview:asyncImage]; 
    loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease]; 
    [cell.contentView addSubview:loginLabel]; 
    fullNameLabel = [[[UILabel alloc] initWithFrame:fullNameLabelFrame] autorelease]; 
    [cell.contentView addSubview:fullNameLabel];  
    asyncImage.tag = IMAGE_TAG; 
    loginLabel.tag = LOGIN_TAG; 
    fullNameLabel.tag = FULL_NAME_TAG; 
} else ... 

Единственное, что должно произойти вне что если блок присвоения свойств, которые изменяются в клетке, как [asyncImage loadImageFromURL:url]; и присваивающих текст этикетки.

Эта строка присваивает свойство объекту, возможно, nil, а затем выделяет объект.

loginLabel.tag = LOGIN_TAG; 
loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease]; 

Вместо этого назначьте свойство после создания объекта.

loginLabel = [[[UILabel alloc] initWithFrame:loginLabelFrame] autorelease]; 
loginLabel.tag = LOGIN_TAG; 

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

loginLabel.text = [NSString stringWithFormat:@"%@",mySTUser.login]; 

Вместо этого, предполагая mySTUser.login, просто назначьте его напрямую.

loginLabel.text = mySTUser.login; 
0

Если ячейка не ноль, то сначала присвоить изображение и метки вары из клетки, а затем инициализировать их снова и снова. Правильно?

Смежные вопросы