我的桌面视图中填充了显示项目名称,价格和品牌的单元格。我从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];
}
}
}
答案 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;
...
}