UITableView загружает каждую ячейку - PullRequest
4 голосов
/ 01 сентября 2009

UITableview должен загружать только те ячейки, которые видны сначала, верно? Мой просмотр таблицы изначально загружает каждую ячейку, что сильно замедляет ее. Я использую около 1000 строк. Хотите, чтобы он загружал ячейку только тогда, когда это необходимо (например, прокрутка пользователем вниз). У кого-нибудь есть идеи, почему он это делает?

Ответы [ 4 ]

1 голос
/ 01 сентября 2009

Я знаю, что cellForRowAtIndexPath вызывается изначально для каждой ячейки. Высота ячеек 89.

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

static NSString *CellIdentifier = @"Cell";
UILabel *textName               = nil;
UIImageView* image              = nil;
unsigned int        DATA_TAG    = 1001;
unsigned int        IMG_TAG     = 1002;

//  Retrieve a cell is Available
cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier];

//  Check if no new cell was available
if (cell == nil) 
{
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];

    //  Set the Accessory Data
    textName = [[[UILabel alloc]initWithFrame:CGRectMake(cell.frame.origin.x, 80, cell.frame.size.width, 20)]autorelease];
    textName.tag                    = DATA_TAG;
    textName.textAlignment          = UITextAlignmentCenter;
    textName.backgroundColor        = [UIColor clearColor];
    textName.highlightedTextColor   = [UIColor colorWithRed:1.0 green:1.0 blue:0.9 alpha:1.0];
    textName.textColor              = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0];
    textName.lineBreakMode          = UILineBreakModeWordWrap;

    [cell.contentView addSubview:textName];

    //Set the Image Data
    image = [[[UIImageView alloc]initWithFrame:CGRectMake(cell.frame.origin.x, cell.frame.origin.y, cell.frame.size.width, 80)]autorelease];
    image.tag = IMG_TAG;
    image.contentMode= UIViewContentModeScaleAspectFit;
    [cell.contentView addSubview:image];

}

Accessory* acc= [[AccessoryManager sharedManager].currentList objectAtIndex:indexPath.row];
if(acc == nil)
    return cell;


textName= (UILabel*)[cell.contentView viewWithTag:DATA_TAG];
textName.text= acc.accessoryName;


image= (UIImageView*)[cell.contentView viewWithTag:IMG_TAG];
[image setImage:acc.accessoryImage];    
return cell;
}
0 голосов
/ 01 сентября 2009

Вы сами вызываете cellForRowAtIndexPath, например, из heightForRowAtIndexPath? Если это так, вам не нужно создавать ячейку, чтобы определить ее высоту.

0 голосов
/ 01 сентября 2009

Это верно - он должен загружать только те, которые он должен. Каковы ваши UITableView rowHeight? Если бы это было очень низко, таблица могла бы загрузить все ячейки

Если это не проблема, вы можете вставить свой код tableView:cellForRowAtIndexPath:?

0 голосов
/ 01 сентября 2009

Можете ли вы опубликовать код? Метод -tableView: cellForRowAtIndexPath вызывается только тогда, когда открывается новый «слот» для потенциальной ячейки, поэтому вам нужно сделать что-то в основном неправильное, чтобы изначально «загрузить каждую ячейку»!

Возможно, вы имеете в виду, что изначально загружаете все данные и хотите сделать это в пакетном режиме?

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