повторяющиеся строки в табличном представлении на uitableviewcell - PullRequest
6 голосов
/ 25 августа 2009

Я нашел несколько сообщений, которые похожи на мою проблему, но не совсем так.

В моем приложении пользователь может перемещаться между несколькими uitableviews, чтобы перейти к желаемому результату. Когда пользователь идет вперед, затем назад, затем вперед и т. Д., Заметно, что строки перерисовываются / переписываются, и текст становится все смелее и смелее.

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

Есть ли что-то, что мне нужно сделать, чтобы строки не пополнялись / перерисовывались каждый раз, когда пользователь перемещается вперед и назад между представлениями таблицы? Нужно ли что-то добавить в приведенный ниже код или добавить что-то в метод viewwillappear (в настоящее время в viewwillappear для таблицы есть «reloaddata», но, похоже, это не помогает)?

Вот мой код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) 
{
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    UILabel *label = [[[UILabel alloc] init] autorelease];
    label.font = [UIFont fontWithName:@"Arial-BoldMT" size:20];
    label.frame = CGRectMake(10.0f, 10.0f, 220.0f, 22.0f);
    label.textColor = [UIColor blackColor];
    label.backgroundColor = [UIColor clearColor];
    label.opaque = NO;
    label.text = [mapareaArray objectAtIndex:indexPath.row];
    [cell.contentView addSubview:label];

    CustomCellBackgroundView *bgView = [[CustomCellBackgroundView alloc] initWithFrame:CGRectZero];
    bgView.borderColor = [UIColor clearColor];
    bgView.fillColor = [UIColor whiteColor];
    bgView.position = CustomCellBackgroundViewPositionSingle;
    cell.backgroundView = bgView;
    return cell;
}

Ответы [ 3 ]

11 голосов
/ 25 августа 2009

Проблема, с которой вы столкнулись, связана с этой строкой:

[cell.contentView addSubview:label];

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

Вместо этого вы должны пометить UILabel, а затем найти его вместе с тегом, чтобы изменить содержимое этого UILabel. Добавьте (и установите все его атрибуты) и пометьте UILabel внутри блока if (cell == nil):

if(cell == nil) {
  // alloc and init the cell view...

  UILabel *label = [[[UILabel alloc] init] autorelease];
  label.tag = kMyTag; // define kMyTag in your header file using #define
  // and other label customizations
  [cell.contentView addSubview:label]; // addSubview here and only here
  ...
}

Затем найдите его с помощью:

UILabel *label = (UILabel *)[cell.contentView viewWithTag: kMyTag];
label.text = [mapareaArray objectAtIndex:indexPath.row];

И нет необходимости повторно добавлять его как подпредставление вне блока if (cell == nil). Подвид уже есть (и поэтому повторное использование представлений ячеек намного эффективнее, если вы делаете это правильно;).

1 голос
/ 25 августа 2009

.h файл 'Define' ставится после инструкций #import в верхней части заголовочного файла, и ставится как 0, потому что я не знаю, как еще его определить:

#define kMyTag 0

.m файл Я обновил этот раздел в соответствии с вашими комментариями, но а) таблица не заполнена, б) когда пользователь перешел к следующему представлению и возвращается к этому представлению, происходит сбой с «нераспознанным селектором, отправленным в экземпляр», и ) Я должен был положить в две «клетки возврата»; записи или он падает. Я думаю, что у меня что-то не в порядке, и, возможно, неправильно инициализировал ????

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        UILabel *label = [[[UILabel alloc] init] autorelease];
        label.tag = kMyTag; // define kMyTag in your header file using #define
        label.font = [UIFont fontWithName:@"Arial-BoldMT" size:20];
        label.frame = CGRectMake(10.0f, 10.0f, 220.0f, 22.0f);
        label.textColor = [UIColor blackColor];
        label.backgroundColor = [UIColor clearColor];
        label.opaque = NO;

        CustomCellBackgroundView *bgView = [[CustomCellBackgroundView alloc] initWithFrame:CGRectZero];
        bgView.borderColor = [UIColor clearColor];
        bgView.fillColor = [UIColor whiteColor];
        bgView.position = CustomCellBackgroundViewPositionSingle;
        cell.backgroundView = bgView;

        [cell.contentView addSubview:label]; // addSubview here and only here
        return cell;
    }
UILabel *label = (UILabel *)[cell.contentView viewWithTag: kMyTag];
label.text = [mapareaArray objectAtIndex:indexPath.row];
return cell;
}
0 голосов
/ 17 июня 2014

Вы должны создать подкласс для UITableViewCell для этой конкретной ячейки, затем применить логику, чтобы увидеть, нужно ли вам добавлять подпредставление к себе каждый раз. Кроме того, используйте UForableviewcell's prepareForReuse и удалите все подпредставления в течение этого времени, прежде чем применять логику, если вы хотите добавить UILabel в свою ячейку.

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