2013-01-11 3 views
0

Здесь tableview после прокрутки 2 3 раза вверх и вниз добавляют изображения во все ячейки. Вот кодDuplicate UItableViewCell, строки UITableView

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

HomeCell *cell = (HomeCell *) [tableView dequeueReusableCellWithIdentifier:@"HomeCell"]; 
if (cell == nil) { 
    cell = [[HomeCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"HomeCell"] ; 
} 

VenueDC *venueObj = [subSubCategoriesArray objectAtIndex:indexPath.row]; 
cell.lblName.text = venueObj.name; 
if ([venueObj.imagesArray count] > 0) { 
    [cell.ivVenue setImage:venueObj.ivVenue]; 
    [cell.ivVenue setHidden:NO]; 
    cell.lblName.frame = CGRectMake(80, cell.lblName.frame.origin.y, 200, cell.lblName.frame.size.height); 
} 
venueObj = nil; 


return cell; 
} 

любой Idear Что происходит здесь, изображение только в одном объекте, при первой загрузке он показывает одну ячейку с изображением, но после того, как прокрутка он начинает показывать изображения на другую клетку тоже

+0

Попробуйте эту тему, может быть, это вам поможет. : http: //stackoverflow.com/questions/10535637/reusablecellwithidentifier-issue-in-cellforrowatindexpath/10535788#10535788 – superGokuN

ответ

3

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

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

HomeCell *cell = (HomeCell *) [tableView dequeueReusableCellWithIdentifier:@"HomeCell"]; 

if (cell == nil) { 

    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"HomeCell" owner:self options:nil]; 

    for (id currentObject in topLevelObjects){ 
     if ([currentObject isKindOfClass:[UITableViewCell class]]){ 
      cell = (HomeCell *) currentObject; 
      break; 
     } 
    } 
} 

VenueDC *venueObj = nil; 
venueObj = [subSubCategoriesArray objectAtIndex:indexPath.row]; 
cell.lblName.text = venueObj.name; 
[cell.ivVenue setHidden:YES]; 
cell.lblName.frame = CGRectMake(20 , 19, 250, 20); 
if (venueObj.ivVenue) { 
    [cell.ivVenue setImage:venueObj.ivVenue]; 
    [cell.ivVenue setHidden:NO]; 
    cell.lblName.frame = CGRectMake(80, cell.lblName.frame.origin.y, 200, cell.lblName.frame.size.height); 
} 
return cell; 
} 
0

ты по требуется инструкция else. Попробуйте:

else { 
venueObj = nil; 
} 
2

UITableViewCells получить повторно, который является то, что dequeueReusableCellWithIdentifier: делает метод. Чтобы сохранить память, UITableView создает только количество ячеек, которые можно увидеть в любой заданной точке, а затем просто продолжает их повторно использовать. Из-за этого вы всегда должны очищать свои ячейки до повторного использования, которые сбрасывают все содержимое до nil.

Если вы используете пользовательский вид таблицы, как в вашем случае HomeCell, то переопределите - (void) prepareForReuse и настройте изображение на нуль.

Надеюсь, что это поможет.

0

Попробуйте

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

HomeCell *cell = (HomeCell *) [tableView dequeueReusableCellWithIdentifier:@"HomeCell"]; 
if (cell == nil) { 
    cell = [[HomeCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"HomeCell"] ; 
} 

VenueDC *venueObj = [subSubCategoriesArray objectAtIndex:indexPath.row]; 
cell.lblName.text = venueObj.name; 
    [cell.ivVenue setImage:nil]; 

if ([venueObj.imagesArray count] > 0) { 
    [cell.ivVenue setImage:venueObj.ivVenue]; 
    [cell.ivVenue setHidden:NO]; 
    cell.lblName.frame = CGRectMake(80, cell.lblName.frame.origin.y, 200, cell.lblName.frame.size.height); 
} 
venueObj = nil; 


return cell; 
} 
+0

теперь его не показывая изображения, но, это изображение, так как вы можете видеть, было скрыто, поэтому оно идет в " Если "и перемещает lblName вперед –

+0

, проверьте, есть ли изображение или нет. Если нет, то не устанавливайте кадр lblname. надеюсь, что это поможет –

0

Попробуйте это:

if(venueObj.ivVenue) 
{ 
     [cell.ivVenue setImage:venueObj.ivVenue]; 
} 
else 
{ 
     cell.ivVenue.image = Nil; 
} 
+0

Можете ли вы объяснить словами, как это ответ на вопрос OP? Этот ответ был отмечен по длине. –

0

вам нужно только добавить одну строку в cellForRowAtIndexPath

NSString *CellIdentifier = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row]; 

И изменить

HomeCell *cell = (HomeCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

Это может быть полезно для вас;)

+0

Это проблема с памятью. что вы думаете? Он не будет повторно использовать какую-либо ячейку с другой, но с тем же самым указательным указателем в том же разделе, что приведет к созданию как можно большего количества ячеек, чем нет строк, присутствующих в представлении таблицы. Исправьте меня, если я ошибаюсь. –

+0

yes u r write .. в этом коде он создает новую ячейку, когда пользователь прокручивает табличное представление не повторно использовать старшую ячейку;) – iPatel

+0

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

1
it is happening because your cell is reuse so write this code 

HomeCell *cell = (HomeCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 

     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"HomeCell" owner:self options:nil]; 

     for (id currentObject in topLevelObjects){ 
      if ([currentObject isKindOfClass:[UITableViewCell class]]){ 
       cell = (HomeCell *) currentObject; 
       break; 
      } 
     } 
    } 
+0

Ур ответ помог мне повысить, но проблема, которую я решил решить, см. Мой ответ –

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