UITableViewCell дублируется снова и снова - PullRequest
1 голос
/ 15 февраля 2011

Я создаю свои ячейки из массива. Последний объект в моей области создается по-другому, так как я хочу добавить новую UILabel в contentView ячейки. (Чтобы в последней ячейке отображалось общее количество записей в UILabel).

По какой-то причине моя последняя ячейка, которая добавляет UILabel в contentView, продолжает дублироваться. Он будет отображаться в других ячейках, испортить их отображение и т. Д. У меня есть чувство, что это связано с повторным использованием ячеек, но я не уверен, как это исправить.

Вот мой метод:

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

    // Bounds
    CGRect bounds = [[UIScreen mainScreen] bounds];

    Person *person = nil;
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        person = [people objectAtIndex:indexPath.row];
    }

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellID];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kCellID] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

        // Check if it is the first cell
        if (person == [people lastObject]) {
            cell.accessoryType = UITableViewCellAccessoryNone;
            cell.userInteractionEnabled = NO;

            UILabel *count = [[UILabel alloc] initWithFrame:CGRectMake(-4, 11, bounds.size.width - 10, 20)];
            count.autoresizingMask = UIViewAutoresizingFlexibleWidth;
            count.textColor = [UIColor darkGrayColor];
            count.font = [UIFont systemFontOfSize:16];
            count.textAlignment = UITextAlignmentCenter;
            count.text = person.nameFirst;
            cell.textLabel.text = nil;
            cell.detailTextLabel.text = nil;
            [cell.contentView addSubview:count];

            return cell;
        }

    }//end

    cell.textLabel.text = [NSString stringWithFormat:@"%@, %@", person.nameLast, person.nameFirst];

    // Check if they are faculty staff
    if ([person.status isEqualToString:@"Staff/Faculty"]) {
        cell.detailTextLabel.text = [NSString stringWithFormat:@"%@: %@", person.status, person.department];
    } else {
        cell.detailTextLabel.text = person.status;
    }//end

    return cell;
}

Может ли кто-нибудь помочь мне понять, как я могу заставить это работать правильно, чтобы моя UILabel не создавалась в разных ячейках?

Ответы [ 2 ]

2 голосов
/ 15 февраля 2011

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *kCellID = @"cellID";
    static NSString *lastCellID = @"lastcellID";

    // Bounds
    CGRect bounds = [[UIScreen mainScreen] bounds];

    Person *person = nil;
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        person = [people objectAtIndex:indexPath.row];
    }

    UITableViewCell *cell;

    if (person != [people lastObject]) {
        cell = [tableView dequeueReusableCellWithIdentifier:kCellID];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kCellID] autorelease];
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        }
        cell.textLabel.text = [NSString stringWithFormat:@"%@, %@", person.nameLast, person.nameFirst];

        // Check if they are faculty staff
        if ([person.status isEqualToString:@"Staff/Faculty"]) {
            cell.detailTextLabel.text = [NSString stringWithFormat:@"%@: %@", person.status, person.department];
        } else {
            cell.detailTextLabel.text = person.status;
        }//end
    } else {
        cell = [tableView dequeueReusableCellWithIdentifier:lastCellID];
        if (cell == nil) {
           cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:lastCellID] autorelease];
           cell.accessoryType = UITableViewCellAccessoryNone;
           cell.userInteractionEnabled = NO;

            UILabel *count = [[UILabel alloc] initWithFrame:CGRectMake(-4, 11, bounds.size.width - 10, 20)];
            count.autoresizingMask = UIViewAutoresizingFlexibleWidth;
            count.textColor = [UIColor darkGrayColor];
            count.font = [UIFont systemFontOfSize:16];
            count.textAlignment = UITextAlignmentCenter;
            count.tag = 1;
            [cell.contentView addSubview:count];
        }
        UILabel *count = (UILabel *)[cell viewWithTag:1];
        count.text = person.nameFirst;
        //cell.textLabel.text = nil;
        //cell.detailTextLabel.text = nil;
    }//end

    return cell;
}
2 голосов
/ 15 февраля 2011

Это, вероятно, потому, что ячейка будет использоваться повторно. Используйте другой идентификатор повторного использования для последней ячейки, например, kLastCellID.

UITableViewCell *cell = nil;
// Check if it is the first cell
if (person == [people lastObject]) {
    cell = [tableView dequeueReusableCellWithIdentifier:kLastCellID];
    if (!cell) {
        //create a last cell, with an UILabel in your content view
    }
    //update the cell's content
} else {
    cell = [tableView dequeueReusableCellWithIdentifier:kCellID];
    if (!cell) {
        //create a regular cell
    }
    //update the cell's content
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...