UITableViewCell - просмотр, показывающий данные поверх данных при повторном использовании - PullRequest
0 голосов
/ 06 июня 2011

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

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

Я уверен, что есть очевидное решение для этого (в настоящее время я просто не использую ячейку повторно, но это не лучшая практика иработает медленно на старых устройствах), так что если кто-то может помочь, я был бы очень благодарен.1011 *

static NSString *CellIdentifier = @"Cell";
TransactionCellView *cell = (TransactionCellView *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if(cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"TransactionCellView" owner:self options:nil];
    cell = tblCell;
}

[cell resetCell]; // clears the labels
[cell setData:[dataArray objectAtIndex:[indexPath row]]; // replaces the data and updates the labels

return cell;

}

Ответы [ 4 ]

2 голосов
/ 28 июня 2011

Решил эту проблему !!!Удивительно просто, когда вы знаете, в чем проблема / была.

Я использовал IB, и "Clear Graphics Context" не был выбран на моей UILabels.Вот почему следующий текст просто перекрывал старый.

Спасибо ребятам за попытку помочь.

1 голос
/ 06 июня 2011

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

1 голос
/ 06 июня 2011

Попробуйте это ..

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

        for (UIView* subView in cell.contentView.subviews)
        {       
            [subView removeFromSuperview];
        }   
       // Your Code to customize cell goes here.
 }
1 голос
/ 06 июня 2011

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString* identifier = @"someidentifier";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
    if(!cell) {
        // create the cell and add all subviews to it
    } else {
        // update the cell and access appropriate subviews to modify what is displayed
    }
    return cell;
}

Ячейка будет создана при первом использовании идентификатора.Для всех последующих запросов ячейка извлекается из кэша UITableView (через dequeueReusableCellWithIdentifier), и затем вы можете получить доступ к его подпредставлениям по тегу, индексу, типу или любому другому выбранному вами механизму.

В некоторой степениС этим связано то, что вы можете иметь несколько идентификаторов ячеек, что позволяет создавать несколько экземпляров разных ячеек в зависимости от имеющихся у вас данных.В одном из моих проектов у меня есть 4 разные ячейки, каждая из которых зависит от количества строк данных, которые они будут отображать (где-то между 1 и 4).Это помогает обеспечить плавную прокрутку независимо от количества строк в ячейке, поскольку средство визуализации не должно беспокоиться о динамическом изменении высоты ячейки на лету.

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