(пользовательский) UITableViewCell перемешивается после прокрутки - PullRequest
1 голос
/ 17 февраля 2011

Я уже несколько недель занимаюсь этой проблемой.

В основном, когда я прокручиваю вверх / вниз в TableView, я использую пользовательскую ячейку, разработанную в IB, и все содержимое перепутывается и теряется

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

Люди продолжают предлагать создать подпросмотр для ячейки таблицы, но я не знаю, как это сделать = /Все еще довольно плохо знакомы с разработкой для iOS, поэтому, если у вас есть возможный ответ, вы можете подробно описать его, пожалуйста.

Еще раз, извините за мой код = /

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

    static NSString *MyIdentifier = @"MyIdentifier";
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:MyIdentifier];

    NSInteger intCellTag;

    NSDictionary *dictionary = [[[self.tableDataSource objectAtIndex: indexPath.section] objectForKey: @"Rows"] objectAtIndex: indexPath.row];


    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier] autorelease];


        [[[NSBundle mainBundle] loadNibNamed:@"EventsCustomTVCell" owner:self options:nil] lastObject];
        cell = tvCell;
        self.tvCell = nil;


        cell.textLabel.backgroundColor = [UIColor clearColor];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

        cell.tag = intCellTag;


        intCellTag++;

        UIImage *customCellBG = [UIImage imageNamed:@"EventsCustomTableCellBG.png"];
        UIImageView *customCellBGImageView = [[UIImageView alloc] initWithImage: customCellBG];
        customCellBGImageView.contentMode = UIViewContentModeScaleToFill;
        cell.backgroundView = customCellBGImageView;
        [customCellBGImageView release];




        [cell.contentView addSubview:imgThumbnail];
        [cell.contentView addSubview:lblName];
        [cell.contentView addSubview:lblDescription];
        [cell.contentView addSubview:lblDate];

    }



    imgThumbnail.image = [UIImage imageNamed:[dictionary objectForKey: @"Thumbnail"]];
    lblName.text = [dictionary objectForKey:@"Title"];
    lblDescription.text = [dictionary objectForKey:@"Description"];
    lblDate.text = [dictionary objectForKey:@"Date"];


    return cell;


}

Ответы [ 5 ]

1 голос
/ 21 марта 2015
iOS Swift: I have done following to resolve my issue

let CellIdentifier: String = "CellIdentifier\(indexPath.section)\(indexPath.row)"

        var cell: UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(CellIdentifier) as UITableViewCell?

        if cell == nil {
            cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: CellIdentifier)
        }
1 голос
/ 17 февраля 2011

Похоже, вы пытаетесь смешать метафоры при определении каждого UITableViewCell - загрузка из .xib и создание подпредставлений вручную.Конечно, в этом нет ничего плохого, но вы можете поместить изображение и метки непосредственно в tableviewCell, например:

enter image description here

и вот код для отображения каждой строки (естественно, в IBвы присвоили ненулевые уникальные теги каждому объекту UIKit, который вы хотите настроить для каждой строки)

#define kImageTag 1
#define kLabel1Tag 2
#define kLabel2Tag 3
#define kLabel3Tag 4

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"MyTvCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        self.tvCell = nil;
        [[NSBundle mainBundle] loadNibNamed:@"TvCell" owner:self options:nil];
        cell = self.tvCell;
    }

    UIImageView *iv =  (UIImageView *) [cell viewWithTag:kImageTag];
    UILabel *lbl1 = (UILabel *) [cell viewWithTag:kLabel1Tag];
    UILabel *lbl2 = (UILabel *) [cell viewWithTag:kLabel2Tag];
    UILabel *lbl3 = (UILabel *) [cell viewWithTag:kLabel3Tag];

    iv.image = [UIImage imageNamed:@"myimage.png"];
    lbl1.text = @"howdy";
    lbl2.text = @"there";
    lbl3.text = @"foo";

    return cell;
}
0 голосов
/ 09 августа 2011

Вы можете использовать

NSString * cellIdentifier = [NSString stringWithFormat: @ "% d", indexPath.row];

вместо

статический NSString * CellIdentifier = @ "Cell";

0 голосов
/ 17 февраля 2011
imgThumbnail
lblName
lblDescription
lblDate

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

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

Допустим, вы назначаете тег 10 для метки lblDescription в interface Builder

, после чего вы замените

lblDescription.text = [dictionary objectForKey:@"Description"];

на

UILabel *lblDescription = (UILabel *)[cell viewWithTag:10];
lblDescription.text = [dictionary objectForKey:@"Description"];

EDITЯ предположил, что imgThumbnail и т. Д. Являются подпредставлениями вашей ячейки, но вы добавляете их снова.Если мое предположение верно, вы должны избавиться от [cell.contentView addSubview ...].

Если я ошибаюсь, вы должны избавиться от imgThumbnail и т. Д. В качестве переменной экземпляра вашего viewcontroller.И добавляйте отдельные UIViews каждый раз, когда создается новая ячейка.Как вы делаете с backgroundview.но вы назначаете тег и используете этот тег при настройке значений в ячейках.

0 голосов
/ 17 февраля 2011

Вы добавляете одни и те же объекты подпредставления в каждую ячейку

[cell.contentView addSubview:imgThumbnail];
[cell.contentView addSubview:lblName];
[cell.contentView addSubview:lblDescription];
[cell.contentView addSubview:lblDate];

Каждая ячейка нуждается в собственном наборе объектов подпредставления.

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