2015-04-09 1 views
0

У меня есть пользовательский класс ячеек таблицы. Я динамически создаю uiviews и uilabels и uiimageview для соты и выделяю и запускаю их с помощью frame.contentView. Но при прокрутке из-за повторного использования они перекрываются, а текст ярлыка и другие свойства перекрываются.tableview dequeue многоразовые перекрытия ячеек

+0

Не могли бы вы прояснить, являются ли ячейки перекрывающимися друг с другом или являются ярлыками и uiimageviews, появляющимися более одного раза в одной ячейке? – JoGoFo

+0

, а также просмотр дополнительных представлений в случае, если предыдущая ячейка добавила дополнительные виды, а у последней - меньше просмотров. – meteors

ответ

0

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

Это означает, что после вызова [dequeueReusableCellWithIdentifier], вы должны сделать что-то вроде:

1) Set/Reset цвета, шрифта и текста на TextLabel и detailTextLabel, если вы когда-либо трогать их.

2) Отрегулируйте принадлежностьType.

3) Отрегулируйте рамки и backgroundColors.

4) Удалите все нестандартные подпункты. Я обычно делаю код следующим образом:

for (UIView *subView in cell.contentView.subviews) { 
    if (subView == cell.textLabel) continue; 
    if (subView == cell.imageView) continue; 
    if (subView == cell.detailTextLabel) continue; 
    [subView removeFromSuperview]; 
} 

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

+0

К сожалению, у меня нет ничего cell.textlabel или любых других переменных. Я использую цикл for для добавления subviews по мере необходимости. и распределять их каждый раз. – meteors

+0

Это были просто примеры. Попробуйте код в 4), который удаляет все дополнительные подзаголовки перед добавлением новых. – robinkunde

0

Проверьте правильность рядов таблицы и размера строки пользовательской ячейки, чтобы получить правильный вид.

Проверьте и отложите ячейку, как это, после повторного использования ячейки tabeview.

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; 
    NSLog(@"cai no init da cell"); 
// change style according to yours.. 
} 

return cell 

}

0

Это звучит, как вы добавляете дочерние представления к клетке внутри метода tableview:cellForRowAtIndexPath:. Когда ячейки повторно используются, представления из предыдущего использования уже существуют в ячейке, и вы игнорируете эти новые представления и просто добавляете больше.

Правильный способ заключается в том, чтобы добавлять представления во время инициализации ячейки, а затем просто устанавливать значения представлений в методе tableview:cellForRowAtIndexPath:.

Вы должны использовать собственный класс, наследующий от UITableViewCell, и создать свойства для просмотров, которые вы хотите добавить (чтобы к ним можно было получить доступ в tableview:cellForRowAtIndexPath:). Затем вы можете либо добавить представления в вызове 10 для пользовательского класса, либо использовать ячейку XIB или прототипа для добавления представлений и привязать их к свойствам как IBOutlets.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    MyModelObject* myObject = myObjects[indexPath.row]; 

    if (myObject.images.count == 1) { 
     MyCustomTableViewCellOne *cell = (MyCustomTableViewCellOne*) [self.tableView dequeueReusableCellWithIdentifier:@"MyCustomTableViewCellOneIdentifer" forIndexPath:indexPath]; 

     cell.title = @"Some item"; 
     cell.imageView.image = [UIImage imageNamed:@"image.png"]; 
     return cell; 
    } else { 
     MyCustomTableViewCellTwo *cell = (MyCustomTableViewCellTwo) [self.tableView dequeueReusableCellWithIdentifier:@"MyCustomTableViewCellTwoIdentifer" forIndexPath:indexPath]; 

     cell.title = @"Some item"; 
     cell.imageView.image = [UIImage imageNamed:@"image.png"]; 
     cell.imageView2.image = [UIImage imageNamed:@"image2.png"]; 
     return cell; 
    } 
} 

MyCustomTableViewCellOne.h:

@interface MyCustomTableViewCellOne : UITableViewCell 

@property (strong, nonatomic) IBOutlet UILabel *title; 
@property (strong, nonatomic) IBOutlet UIImageView *imageView; 

@end 

MyCustomTableViewCellTwo.h:

@interface MyCustomTableViewCellTwo : UITableViewCell 

@property (strong, nonatomic) IBOutlet UILabel *title; 
@property (strong, nonatomic) IBOutlet UIImageView *imageView; 
@property (strong, nonatomic) IBOutlet UIImageView *imageView2; 

@end 
+0

Но как мне создать свойства? Для одной ячейки я хочу добавить 4 subview и 2 для других. Количество подзадач не остается фиксированным. – meteors

+0

Если у вас есть несколько разных макетов, которые вы хотите использовать, создайте ячейки прототипов и пользовательские классы для каждого из этих макетов. Если есть слишком много, чтобы создавать или каждый раз будет отличаться друг от друга, то, как предложил @rkunde, лучший способ - сбросить ячейку каждый раз, удалив все подпункты. – JoGoFo

+0

Я обновил свое решение с помощью некоторого примерного кода, если вы идете с пользовательским подходом класса. Вам нужно будет заменить логику для определения того, какой тип ячейки используется. – JoGoFo

0

Наконец решил проблему с помощью тега для каждого подвид. После получения представления по тегу из его родительского представления, если вид отсутствует, я перераспределяю и добавляюSubView. Это решило проблему.