如何摆脱特定的TableView单元格

时间:2014-06-27 23:00:08

标签: ios objective-c xcode web-services uitableview

我的桌面视图中填充了显示项目名称,价格和品牌的单元格。我从Web服务获得的一些对象返回,并且在表视图单元格上看起来很丑。我不想填充价格为" null"的表格视图单元格。到目前为止,这是我的代码。现在,我将其更改为" Price Unavailable"。

   for (NSDictionary *objItem in resultsArray)
{
     NSString *currentItemName = [objectTitlesArray objectAtIndex:indexPath.row];

    if ([currentItemName isEqualToString:objItem[@"title"]])
    {
        if (cell.priceLabel.text != (id)[NSNull null] && cell.priceLabel.text.length != 0 && cell.brandLabel.text != (id)[NSNull null] && cell.brandLabel.text.length != 0)
        {


        cell.nameLabel.text = currentItemName;

            NSDictionary *bestPageDictionary = objItem[@"best_page"];

            NSNumber *price = bestPageDictionary[@"price"];

            if ((cell.priceLabel.text = @"<null>"))
            {
                cell.priceLabel.text = @"Price Unavailable";
            }

            else
            {

            cell.priceLabel.text = [NSString stringWithFormat:@"$%@", price];
            }


            NSArray *brandsArray = objItem[@"brands"];
        cell.brandLabel.text = [brandsArray firstObject];
        }

    }
}

1 个答案:

答案 0 :(得分:3)

这非常低效。您保持JSON(我假设)在字典中返回,然后循环遍历您正在创建的每个单元格的字典。不仅如此,您还没有提前清理JSON。

创建无用的单元格要昂贵得多,然后返回并尝试删除它。在numberOfRowsInSection代表中,您已经告诉tableview您有X个单元格。现在,您正在尝试删除会破坏回调的单元格。您必须创建一个方法,该方法将在您完成创建所有单元格后运行,然后遍历所有单元格以从tableView中删除它们,然后将调用[table reloadData]。但是,因为您实际上并没有从NSDictionary中删除数据,实际上您将再次创建相同数量的单元格并陷入无限循环。

<强> 解决方案:

首先,改变你的结构。获得JSON返回后,清理它以删除所有没有价格的值。我建议还使用一个对象类来保存每个服务器对象。这将为TableView以及其他类简化代码。既然您已经清理了退货,请将其从NSDictionary更改为NSMutableArray。然后在numberOfRowsInSection:中拨打[array count]。在cellForRowAtIndexPath:中,您只需查看[array objectAtIndex:indexPath.row]即可获得您的对象。

您希望代码通常如下所示:

ServerItem.h : NSObject{
  @property (nonatomic,retain) NSString* name;
  ...
  add in other properties here
}


- (NSMutableArray *) parseJSON:(NSDictionary *)jsonDict{
  NSMutableArray *returnArray = [NSMutableArray array];
  NSArray *dictArray = [NSArray arrayWithArray:jsonDict[@"results"]];
  for (NSDictionary *itemDict in dictArray)
  {
    NSDictionary *bestPageDictionary = objItem[@"best_page"];
    if (![bestPageDictionary[@"price"] isEqualToString:@"<null>"]])
    {
      ServerItem item = [ServerItem new];
      item.price = ...
      item.name = ....
      [returnArray addObject:item];
    }       
  }
  return returnArray;
}

在您的webService代码中:

self.itemArray = [self parseJSON:dataDictionary];

然后

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.itemCallArray count]    
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  ...
  ServerItem *cellItem = [self.itemsArray objectAtIndex:indexPath.row];
  cell.nameLabel.text = cellItem.name;
  cell.priceLabel.text = cellItem.price;
  ...

}