2009-11-05 3 views
2

У меня есть UITableView с двумя разделами: бесплатный и оплаченный. Каждый раздел имеет различную ячейку. Свободные ячейки имеют две метки и изображение. Платные ячейки имеют две метки, изображение и кнопку, которые позволяют покупать продукт. После покупки продукта кнопка BUY на этой конкретной ячейке не должна отображаться снова. Говорит, что это как клетки инициализируются ...iOS: UITableView reloadData не работает

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *IDNormal = @"Normal"; 
    static NSString *IDComplex = @"Complex"; 


    if (indexPath.section == 0) { // show free objects 

     UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:IDNormal]; 

     if (cell == nil) { 
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
              reuseIdentifier:IDNormal] autorelease]; 

      // product description 
      UILabel * labelDescription = [[UILabel alloc] initWithFrame:CGRectMake(5.0, 54.0, 225, 18)]; 
      [labelDescription setTextAlignment:UITextAlignmentLeft]; 
      [labelDescription setBackgroundColor:[UIColor whiteColor ]]; 
      [labelDescription setClipsToBounds:YES]; 
      [labelDescription setFont:[UIFont systemFontOfSize:14.0]]; 
      [labelDescription setTextColor:[UIColor blackColor]]; 
      [labelDescription setAlpha:0.6]; 
      [labelDescription setTag: 860]; 
      [cell addSubview:labelDescription]; 
      [labelDescription release]; 

      // this will show the word FREE on free objects (cells) 
      UILabel * labelFREE = [[UILabel alloc] initWithFrame:CGRectMake(235.0, 54.0, 80, 18)]; 
      [labelFREE setTextAlignment:UITextAlignmentCenter]; 
      [labelFREE setBackgroundColor:[UIColor greenColor ]]; 
      [labelFREE setClipsToBounds:YES]; 
      [labelFREE setFont:[UIFont boldSystemFontOfSize:14.0]]; 
      [labelFREE setTextColor:[UIColor blackColor]]; 
      [labelFREE setAlpha:0.75]; 
      [labelFREE setText:NSLocalizedString(@"freeKey", @"")];  
      [labelFREE setTag: 861]; 
      [cell addSubview:labelFREE]; 
      [labelFREE release]; 

     } 


     cell.imageView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
      pathForResource:[NSString stringWithFormat: @"free%d", indexPath.row] ofType:@"jpg"]];  
     NSString * prefixLabel = [NSString stringWithFormat: @"gratis%d", indexPath.row]; 

     UILabel *labelDescription2 = (UILabel*)[cell viewWithTag:860]; 
     [labelDescription2 setText:@"FREE"]; 

     return cell; 

    } else { // show paid objects 

     UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:IDComplex]; 

     if (cell == nil) { 
      cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
              reuseIdentifier:IDComplex] autorelease]; 

      UILabel * labelDescription = [[UILabel alloc] initWithFrame:CGRectMake(5.0, 54.0, 225, 18)]; 
      [labelDescription setTextAlignment:UITextAlignmentLeft]; 
      [labelDescription setBackgroundColor:[UIColor whiteColor ]]; 
      [labelDescription setClipsToBounds:YES]; 
      [labelDescription setFont:[UIFont systemFontOfSize:14.0]]; 
      [labelDescription setTextColor:[UIColor blackColor]]; 
      [labelDescription setAlpha:0.6]; 
      [labelDescription setTag: 1]; 
      [cell addSubview:labelDescription]; 
      [labelDescription release]; 

     } 



     int numberPaidObject = indexPath.row + 500; 



     cell.imageView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
      pathForResource:[NSString stringWithFormat: @"table-pg%d", numberPaidObject] ofType:@"jpg"]];  

     NSString * nomeDoProduto = [NSString stringWithFormat: @"paid%d", numberPaidObject]; 


     if (NotSoldProduct) { 

      NSString * prefixoEtiqueta = [NSString stringWithFormat: @"paid%d", numberPaidObject]; 

      UILabel *labelDescription2 = (UILabel*)[cell viewWithTag:1]; 
      [labelDescription2 setText:[description objectAtIndex: numberPaidObject ]; 

     } 

     return cell; 

    } 
} 

, как я должен определить, какая BUY кнопка была нажата, и я использую dequeueReusableCellWithIdentifier, так что я должен использовать следующий метод ...

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 

    int numeroOfPaidObject = indexPath.row + 500; 

    if ((indexPath.section == 1) && ObjectForSale) { 
     // if paid objects and object was not bought yet 
     // in theory this section will not be executed if the object was already bought and paid 
     // so, I am skipping the BUY button creation and, in theory the cell will not have a BUY 
     // button… the problem is that it does... 

     UIButton * buyButton = [[UIButton alloc] initWithFrame:CGRectMake(235, 45, 80, 30)]; 
     buyButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
     buyButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; 
     [buyButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 
     buyButton.titleLabel.font = [UIFont boldSystemFontOfSize:14]; 
     buyButton.backgroundColor = [UIColor clearColor]; 
     [buyButton addTarget:self action:@selector(buyNow:) forControlEvents:UIControlEventTouchDown]; 

     [buyButton setTitle:NSLocalizedString(@"buyKey", @"") forState:UIControlStateNormal]; 

     UIImage *newImage = [[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] 
              pathForResource: @"whiteButton" ofType:@"png"]] 
          stretchableImageWithLeftCapWidth:12.0f topCapHeight:0.0f]; 

     [buyButton setBackgroundImage:newImage forState:UIControlStateNormal]; 

     [buyButton setTag: numeroOfPaidObject]; 
     [cell addSubview:buyButton]; 

     [buyButton release]; 
    } 
} 

Проблема с этим кодом: когда я перезаряжаю данные таблицы, кнопка «ПОКУПАТЬ» продолжает отображаться на всех ячейках, включая те, которые уже были куплены пользователем.

Любые идеи?

благодарит за любую помощь.

ответ

7

Вы можете пройти через него с помощью отладчика, но вот мое предположение:

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

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

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

Вы захотите реорганизовать свой код, чтобы кнопка была добавлена ​​один раз, в tableView:cellForRowAtIndexPath: и только для вновь созданных ячеек.

Есть два способа сделать это:

  1. Разделить «Комплекс» тип клеток на два типа: купил и unpurchased, а также создавать/из очереди их по отдельности. Добавьте кнопку только к типу без покупки.

  2. Добавить кнопки ко всем ячейкам в разделе «платные» и скрыть их, когда товар был куплен.

В любом случае вам понадобится способ захвата указателя на кнопку.Предпочтительный способ сделать это с tag свойства, что делает его одним подкрылка:

UIButton * button = [cell viewForTag:42]; 
... 

Вы также можете перебирать подобозрение ячейки ищут объекты UIButton:

UIButton *button = nil; 

foreach (UIView *view in cell.subviews) { 
    if ([view isKindOfClass:[UIButton class]]) 
     button = (UIButton *)view; 
} 

Я хотел бы предложить используя постоянную метку для идентификации кнопки, а затем переписать метод buyNow: следующим образом:

-(IBAction)buyNow:(id)sender { 
    UITableViewCell *cell = (UITableViewCell *)((UIView *)sender).superview; 

    int itemID = [tableView indexPathForCell:cell].row + 500; 

    ... 
} 
+0

это в теории, что эта строка «if ((indexPath.section == 1) && ObjectForSale)» означает, что кнопка отображается только в том случае, если объект продается (не приобретается) ... – SpaceDog

+0

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

+0

У меня были ситуации, когда я задал цвет текста красным в предложении 'if' и имел красный текст в ячейках, где код в' if' так и не был достигнут. После добавления строки 'else cell.textLabel.color = [UIColor blackColor] все работало, как ожидалось. –

0

Может быть, я имею в виду, слишком просто здесь, но таблица соесть w будет нормально функционировать только с установленными делегатами, но не сможет ответить на reloadData, если вы не установили соединение в IB, вы это проверили?

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