2014-09-23 2 views
1

Когда я просматриваю свой пользовательский UITableviewCells, вы получаете неправильный контент (текст другой ячейки). Это происходит случайным образом. Я попробовал очистить ячейку, но потом у меня есть ячейка пробелов. Мой код ниже. Может ли кто-нибудь сказать мне, что происходит. Я прочитал много статей отсюда и в другом месте, что ячейку нужно очистить, но никто не работал для меня, поскольку я не уверен, в какой момент вы очищаете данные. Я даже пытался реализовать prepareForReuse в классе моей ячейки, но ничего хорошего.UITableviewCell отображает текст для другой ячейки при прокрутке

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if ([self.products count] == 0) { 
     UITableViewCell *cell = [[UITableViewCell alloc] init]; 
     return cell; 
    } 

    static NSString *CellIdentifier = @"AvailableCustomerProductCell"; 

    AvailableCustomerProductTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    cell.accessoryType = UITableViewCellAccessoryNone; 

    cell.buttonAdd.tag = indexPath.row; 
    [cell.buttonAdd addTarget: self action: @selector(addToSelectedProduct:) forControlEvents: UIControlEventTouchUpInside]; 

    Product *prod = nil; 
    if (theTableView == self.searchDisplayController.searchResultsTableView) { 
     prod = (Product *)[self.filteredProducts objectAtIndex:indexPath.row]; 
    } else { 
     prod = (Product *)[self.products objectAtIndex:indexPath.row]; 
    } 

    if (prod != nil) { 
     cell.pNumber.text = prod.number; 
     cell.description.text = prod.desc; 

     if ([Common getProductPromotion:prod] != nil) { 
      cell.btnPromotionTag.hidden = NO; 
      cell.btnPromotionTag.tag = indexPath.row; 
      [cell.btnPromotionTag addTarget: self action: @selector(showPromotionDetails:) forControlEvents: UIControlEventTouchUpInside]; 
     } 
     else{ 
      cell.btnPromotionTag.hidden = YES; 
     } 

     //Get the customer product price, first: 
     //If if the product has a record in the productCustomerPrices list 
     //if not get the price from the standard price. 

     if (self.order.orderOrderCustomer != nil) { 
      CustomerPrice *custPrice = [Common getPriceForCustomer:self.order.customerRef forProduct:prod.productId]; 

      if (custPrice != nil) { 
       //get the customer price 
       [cell.btnPrice setTitle:[Common getCurrencyFormattedStringFromFloat:[custPrice.price floatValue]] forState:UIControlStateNormal]; 
       [cell.btnPrice setTitleColor:[UIColor colorWithRed:0.01 green:0.65 blue:0.77 alpha:1] forState:UIControlStateNormal]; 
       cell.btnPrice.enabled = NO; 
      }else{ 
       //get the standard price 
       float price =[[Common GetProductStandardPrice:prod.productStanddardPrices ByQuantity:[NSNumber numberWithInt:1]] floatValue]; 
       [cell.btnPrice setTitle: [Common getCurrencyFormattedStringFromFloat:price] forState:UIControlStateNormal ]; 
       [cell.btnPrice setTitleColor:[UIColor colorWithRed:1.0 green:0.39 blue:0.0 alpha:1] forState:UIControlStateNormal]; 
       cell.btnPrice.tag = indexPath.row; 
       [cell.btnPrice addTarget: self action: @selector(showStandardPrices:) forControlEvents: UIControlEventTouchUpInside]; 
       cell.btnPrice.enabled = YES; 
      } 
     } 
    } 

    UISwipeGestureRecognizer* sgr = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(cellSwiped:)]; 
    [sgr setDirection:UISwipeGestureRecognizerDirectionRight]; 
    [cell addGestureRecognizer:sgr]; 

    return cell; 
} 
+0

Какой объекта, текст не исчезает? – rebello95

+0

BTW вы должны добавить распознаватель жестов внутри подкласса ячейки, а не в cellForRow – rounak

+0

Целевой метод находится на контроллере представления. Слишком много хлопот, чтобы вызвать его из ячейки, насколько я знаю. –

ответ

1

Ваша проблема почти наверняка связан с тем, что просмотрами таблицы рециркуляцию клеток. Вот почему клетки должны быть «очищены», как вы выразились.

Например, если у вас есть одна ячейка рядом с верхней частью, на которой отображается изображение, если вы прокручиваете дальше вниз, и эта же ячейка используется для отображения ячейки, у которой не должно быть изображения, это изображение все равно будет отображаться если вы не удалили его с тех пор. Даже если у вас было 100 ячеек для отображения, вероятно, существует только несколько экземпляров, которые фактически существуют - они перерабатываются.

Это, как говорится, даже если вы не сказали, какой текст продолжает появляться, если prod является nil, это может быть множество объектов, в том числе и pNumberdescription. То же самое происходит, если self.order.orderOrderCustomer - nil. Для того, чтобы избежать таких вещей, вы можете просто поставить что-то вроде следующего сразу после получения cell:

cell.pNumber.tex = @""; 
cell.description.text = @""; 
//etc 

Другое примечание: Вы хотите добавить цель на кнопку вашей ячейки buttonAdd. Перед этим следует удалить существующие действия в строке. Например:

[cell.buttonAdd removeTarget:nil action:NULL forControlEvents:UIControlEventAllEvents]; 
[cell.buttonAdd addTarget: self action: @selector(addToSelectedProduct:) forControlEvents: UIControlEventTouchUpInside]; 

То же самое касается и btnPromotionTagbtnPrice.

+0

Удалить цель - хорошая идея. Я добавил спасибо –

+0

Вы попробовали остальную часть решения? Это сработало? – rebello95

+0

Я пробовал [cell.btnЦена setTitle: @ "" forState: UIControlStateNormal]; сразу после деактивации ячейки это не сработало. –

1

Убедитесь, что состояние ячейки сбрасывается в каждом вызове cellForRowAtIndexPath. У вас есть куча условий if/else, и поток управления таков, что код для настройки содержимого в ячейке вообще не вызывается, поэтому содержимое из ранее использованной ячейки остается.

Мое правило всегда иметь соответствующие условия else для if s, где я изменяю состояние ячейки (если ничего, по крайней мере, пустое). В случае подклассов UITableViewCell вы можете сбросить состояние в prepareForReuse

+0

Неверный текст - это данные цены –

+0

Я прокомментировал оба варианта - они не нужны, они всегда равны true –

+0

По-прежнему возникает проблема после удаления if (prod! = Nil) { и –

0

Как правило, лучше использовать тот же идентификатор для всех ячеек, если есть сотни записей, чтобы ячейки могли повторно использовать память. В противном случае, если Tableview достаточно длинный, и пользователь быстро прокручивает его, вызовет много allocs/deallocs, что приведет к негладкой прокрутке. Затем всегда ставьте строковый код вне условия, которое проверяет ячейку как nil.

Посмотрите на этот фрагмент кода:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *cellIdentifier = @"MY_CELL_IDENTIFIER"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; 
     // Everything that is similar in all the cells should be defined here 
     // like frames, background colors, label colors, indentation etc. 
    } 
    // everything that is row specific should go here 
    // like image, label text, progress view progress etc. 
    return cell; 
} 
+0

Я использую один и тот же идентификатор для всех ячеек. Нильская ячейка? Проверяю. Я использую раскадровку, и там определена ячейка прототипа. Насколько я знаю, dequeueReusableCellWithIdentifier гарантированно не возвращать нуль в этой настройке –

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