2013-08-30 4 views
1

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

enter image description here

Значок второй замок не принадлежит там ... я не уверен, как и почему ее в конечном итоге там. В этом примере массив имеет счетчик 2, поэтому дополнительная блокировка даже не внутри ячейки.

Это никогда не происходит при начальной нагрузке, но происходит, как только ячейки перезагружаются в первый раз. Это также меня смущает, потому что начальная функция загрузки такая же, как функция перезагрузки.

Вот код для самой клетки:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [UITableViewCell configureFlatCellWithColor:[UIColor greenSeaColor] selectedColor:[UIColor wetAsphaltColor] reuseIdentifier:CellIdentifier inTableView:(UITableView *)tableView]; 

    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 
     [cell configureFlatCellWithColor:[UIColor greenSeaColor] selectedColor:[UIColor wetAsphaltColor]]; 

    } 

    Room *room; 

    //is data filtered? 
    if(isFiltered) 
    room = [filteredTableData objectAtIndex:indexPath.row]; 
    else 
    room = [roomList objectAtIndex:indexPath.row]; 


    cell.textLabel.text = room.roomName; 
    cell.detailTextLabel.text = room.hostUsername; 

    //lock icon or not 
    if(room.password != nil) 
{ 
    UIImageView *pw = [[UIImageView alloc] initWithImage:img]; 
    pw.tag = [room.rid integerValue]; 
    [pw setImage:img]; 
    pw.frame = CGRectMake(cell.frame.size.width - cell.frame.size.height, cell.frame.origin.y, 
          cell.frame.size.height - 2, cell.frame.size.height - 2); 
    [cell.contentView addSubview:pw]; 
} 
else{ //remove the content view if not needed 
    [[cell.contentView viewWithTag:[room.rid integerValue]] removeFromSuperview]; 
} 


    return cell; 
} 

Для записи, это не происходит iOS7 (я знаю, что под NDA, но просто хотел бы отметить тот факт, если это помогает).

+0

, что это не фантом клетки. :) это просто проблема с авторезистом-маской; ячейка появится позже, и размер фрейма не определен, когда '-tableView: cellForRowAtIndexPath:' вызывается, и вы помещаете значок блокировки в совершенно неправильное положение. 1) установите координаты _absolute_ для фрейма 'pw' вместо _relative_, ** OR ** 2) правильно установите маску авторезистора для объекта' pw'. – holex

ответ

2

значок не очищается повторно используемых клеток, поэтому удалите Pw вид, если он не имеет пароля

if(room.password != nil) 
{ 
    ... 
    pw.tag = 12345; 
} else { 
    [[cell.contentView viewWithTag:12345] removeFromSuperView]; 
} 

Конечно, я бы порекомендовал вам назначить этот вид ячейки accessoryView вместо делая это, как сейчас, но это отвечает на ваш вопрос. Смотрите docs для получения дополнительной информации о accessoryView

+0

спасибо, я думал, что проблема была в этих строках, но она все еще появляется. –

+0

Держу пари, вы добавляете новое представление каждый раз, поверх существующих видов блокировки. – coneybeare

+0

Да, вы правы, это выглядит так, в конечном итоге это будет подклассом и сделано правильно, но я не понимаю, почему существует третья «ячейка»? Разве они не лежат друг над другом? Если я могу назвать его ячейкой, так как на ней нет интерактивности. Я смотрю, как он работает с отладчиком, и подсчет массива никогда не проходит мимо двух элементов. Я также обновил код выше с вашими дополнениями. –

0

Я в конечном итоге создать свою собственную UITableViewCell, инициализирует изображение и использовать эти две функции для замка:

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

     img = [UIImage imageNamed:@"password.png"];     
     pw = [[UIImageView alloc] initWithImage:img]; 
     [pw setImage:img]; 
     pw.frame = CGRectMake(self.frame.size.width - self.frame.size.height, self.frame.origin.y, 
           self.frame.size.height - 2, self.frame.size.height - 2); 
     pw.tag = 1; 

    } 
    return self; 
} 
-(void)enableLock{ 
    [self.contentView addSubview:pw]; 
} 

-(void)disableLock{ 
    [[self.contentView viewWithTag:1]removeFromSuperview]; 
} 
+0

Хотя подклассификация ваших ячеек просмотра таблицы рекомендуется, это не имеет никакого отношения к исправлению. Он работает только сейчас, потому что вы правильно настроили настройку viewWithTag. – coneybeare

Смежные вопросы