UITableView перезапись

У меня есть приложение UITableView, состоящее из текста и изображений. Ячейки иногда перезаписываются, и если я прокручиваю, проблема усугубляется. См. http://web-cars.com/images/temp_img/Simulator-Screen-Shot.png

У меня была такая же проблема в предыдущем приложении, и друг показал мне, как ее решить, создав подкласс UITableViewCell. Это было текстовое приложение, и я не могу получить то же решение с изображениями.

Вот мой подкласс UITableViewCell:

-(void)prepareForReuse  {
    self.permLabel101.text = @"";
    self.permUIImageView201.image = nil;
}

-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier    {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    UILabel *label101 = [[UILabel alloc]initWithFrame:CGRectMake(5, 5, 310, 100)];
    label101.tag = 101;
    [label101 setLineBreakMode:NSLineBreakByWordWrapping];
    [label101 setFont:[UIFont systemFontOfSize:FONT_SIZE]];
    label101.textColor = [UIColor blackColor];
    label101.backgroundColor = [UIColor clearColor];
    label101.numberOfLines = 0;

    self.permLabel101 = label101;

    [self.contentView addSubview:self.permLabel101];

    UIImageView *image201 = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 100)];
    image201.tag = 201;

    return self;
}

Вот мой cellForRowAtIndexPath. Я разделяю текст и изображения с помощью photo_text.

- (MyTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSManagedObject *object = (NSManagedObject *)[entityArray objectAtIndex:indexPath.row];

    NSString *CellIdentifier = @"Cell";

    int photo_text = [[object valueForKey:@"photo_text"]intValue];

    MyTableViewCell *cell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)   {
        cell = [[MyTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    cell.selectionStyle = UITableViewCellSeparatorStyleNone;
    [self.tableView setSeparatorColor:[UIColor clearColor]];    // Eliminates border between cells

    if (photo_text == 1)    {   //  Image will be here

        NSNumber *imgHeight = [[entityArray objectAtIndex:indexPath.row]valueForKey:@"imgHeight"];
        float imgHeightFloat = [imgHeight floatValue];
        NSLog(@"imgHeightFloat: %f", imgHeightFloat);

        UIImageView *imv = [[UIImageView alloc]initWithFrame:CGRectMake(0, 2, 320, imgHeightFloat)];    //  imv is OK
        UIImageView *image201View = [[UIImageView alloc]initWithFrame:CGRectMake(0, 2, 320, imgHeightFloat)];

        imv.image = [UIImage imageNamed:[object valueForKey:@"photo"]];
        image201View.image = [UIImage imageNamed:[object valueForKey:@"photo"]];

        NSLog(@"Image cell: %@", cell);

        NSString *title = [object valueForKey:@"title"];
        self.title = title;
        [cell.contentView addSubview:image201View];

        return cell;

    }   else if (photo_text == 2)       {   //  Text will be here

        UILabel *label101;

        cell.selectionStyle = UITableViewCellSeparatorStyleNone;
        [self.tableView setSeparatorColor:[UIColor clearColor]];    //  Eleminates border between cells

        NSString *text = [object valueForKey:@"text"];

        CGSize constraint = CGSizeMake(296.0f, 20000.0f);
        CGSize size = [text sizeWithFont: [UIFont systemFontOfSize:12.0f] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping];

        NSLog(@"Text cell: %@", cell);

        label101 = (UILabel *)[cell viewWithTag:101];

        label101.frame = CGRectMake(5, 5, 320, size.height);
        label101.text = [NSString stringWithFormat:@"%@", text];

        NSString *title = [object valueForKey:@"title"];
        self.title = title;

        return cell;
    }
        // Configure the cell...
//    return cell;
}

Ваши предложения приветствуются!

проблема повторного использования ячеек. Это поможет. stackoverflow.com/questions/52258956/…, stackoverflow.com/questions/50916739/…

Rakesha Shastri 30.12.2018 09:05

При подготовке к повторному использованию ячеек self.permUIImageView201.image = nil; не подействует, так как здесь нет ссылки! и каждый раз, когда ячейка повторно используется, `` cellForRowAtIndexPath '' добавляет представление изображения в ячейку без удаления предыдущего, что вызывает проблему.

vignesh 31.12.2018 06:56

@vignesh: Я думал, что - (void) prepareForReuse в MyTableViewCell удалит изображение, что предотвратит его повторное использование, но теперь я вижу, что это не так. Я пробовал image201View.image = nil; в cellForRowAtIndexPath и в MyTableViewCell, но там не повезло. Я согласен с тем, что добавляю изображение, не удаляя предыдущее, но не знаю, как удалить это изображение. Какие-либо предложения?

safari yellow 31.12.2018 20:52

@safariyellow, присвоение ссылки с nil, не приведет к удалению представления, добавленного как subview, вам нужно сделать removeSubview с тегом при повторном использовании ячейки.

vignesh 04.01.2019 09:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Друг смог указать мне правильное направление.

Моя основная проблема заключалась в том, что у меня был конфликт CellIdentifier.

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

NSString *CellIdentifier = @"cell";

И мне нужно было использовать разные CellIdentifiers для ячеек изображения и текста:

NSString *CellIdentifier = @"cell";

и NSString * CellIdentifier = @ "ячейка2";

Также оказалось, что мне не нужно было помещать мои UILabel и UIImageView в подкласс UITableViewCell.

Наконец, чтобы избавиться от предупреждения на cellForRowAtIndexPath: мне нужно

`        return cell;
}   else    {
    return nil;
}`

Другие вопросы по теме