Хорошие способы обновить UITableView - PullRequest
1 голос
/ 16 июля 2011

Мне было интересно узнать о хороших и эффективных для памяти способах перезагрузки всех изменений, внесенных в UITableView. Представьте себе нативные приложения для заметок Apple, которые обновляют UITableView, если вы изменили дату / заголовок заметки.

Когда я анимирую индекс, который показывает вам содержимое, я перезагружаю данные моего индекса следующим образом:

[indexTable reloadData];

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

//if (cell == nil) { // assign a label to them, e.g. the title of a note

    //} else {
    //   label = (UILabel *) [cell viewWithTag:1];
    //}

См. Ниже весь код. Теперь мне действительно интересно, что делает бит label = (UILabel *) [cell viewWithTag:1];? Все, что я знаю, это то, что он не обновляет мои данные, если пользователь, например, ввел новый заголовок заметки (несмотря на то, что я вызывал перезагрузку indexTable!).

Буду ли я сталкиваться с серьезными проблемами, оставляя их, как я делаю в следующем коде?

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

    static NSString *CellIdentifier = @"Cell";    
    UILabel *label;
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    //NSLog(@"checking if cell is nil");

    //if (cell == nil) {

        NSLog(@"cell=nil");

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        CGRect frame = CGRectMake(10, 0, 200, 30);
        label = [[UILabel alloc] initWithFrame:frame];
    label.lineBreakMode = UILineBreakModeTailTruncation;
        label.tag = 1;
    label.text = [[indexContent objectAtIndex:indexPath.row] itemTitle];

        [cell.contentView addSubview:label];
        [label release];

    //} else {
    //   label = (UILabel *) [cell viewWithTag:1];
    //}

    return cell;
}

Любые объяснения будут очень признательны!

Ответы [ 2 ]

1 голос
/ 16 июля 2011

Вы должны проверить результат
[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; будет nil, хотя это не произойдет, но приложение не будет зависать, вы будете инициировать / выделять новую ячейку при каждом вызове этого метода, и лучше попытаться использовать ячейку повторно (зачем восстановить ячейку, если вы каждый раз выделяете / инициируете новую?).
label = (UILabel *) [cell viewWithTag:1]; не делает никаких обновлений наверняка, он просто извлекает UILabel, который является подпредставлением ячейки с данным тегом. В части if вы выделяете / инициируете новую ячейку, поскольку она требуется, и настраиваете ее свойства frame, lineBreakMode и tag и добавляете ее в ячейку.

Таким образом, чтобы обновить содержимое (используя [tableView reloadData];), извлеките часть установки содержимого UILabel вне последовательности if / else и обрежьте часть else:

if(cell == nil) {
    //init/alloc and configure a new cell
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:CellIdentifier] autorelease];
    CGRect frame = CGRectMake(10, 0, 200, 30);
    label = [[UILabel alloc] initWithFrame:frame];
    label.lineBreakMode = UILineBreakModeTailTruncation;
    label.tag = 1;
    [cell.contentView addSubview:label];
    [label release];

}
// you either retrieved the cell, or just created it
// retrieve the label and update the content
label = (UILabel *) [cell viewWithTag:1];
label.text = [[indexContent objectAtIndex:indexPath.row] itemTitle];
return cell;
1 голос
/ 16 июля 2011

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

if (cell == nil) {
   NSLog(@"cell=nil");
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

Таким образом, он не будет выделять и создавать новую ячейку каждый раз, когда вы прокручиваете таблицу вниз или вверх. Лучший способ перезагрузить всю таблицу - это [tableview reloadData]; согласно моим знаниям.

Надеюсь, эта помощь.

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