我有一个iphone应用程序,它从xml文件读取“类别”字段,该字段是rss提要。我的应用程序的工作方式是它按照xml“category”字段中的类别在表格视图中显示rss feed的内容。
我对tableviews有点新意,所以有点迷失。
我在xml文件中只有两个类别,一个名为“Uncategorized”,另一个名为“Promos”。
目前的代码是:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 2;
}
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case 0:
return itemsToDisplay.count;
default:
return itemsToDisplay.count;
}
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
if(section == 0)
return @"Promoções";
else
return @"Não Categorizados";
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
if (indexPath.section == 0) {
MWFeedItem *item = [itemsToDisplay objectAtIndex:indexPath.row];
if([item.category isEqualToString:@"PROMOS"]){
MWFeedItem *item = [itemsToDisplay objectAtIndex:indexPath.row];
NSLog(@"ENTRA NO PROMOS____________________");
NSLog(@"item.category = %@-------------->", item.category);
// Process
NSString *itemTitle = item.title ? [item.title stringByConvertingHTMLToPlainText] : @"[No Title]";
NSString *itemSummary = item.summary ? [item.summary stringByConvertingHTMLToPlainText] : @"[No Summary]";
NSLog(@"IMAGE (table View) = %@",item.image);
NSURL *url = [NSURL URLWithString:item.image];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
NSData * imageData = [NSData dataWithContentsOfURL:url];
UIImage * image = [UIImage imageWithData:imageData];
// Set
cell.imageView.image = image;
cell.textLabel.font = [UIFont boldSystemFontOfSize:15];
cell.textLabel.text = itemTitle;
NSMutableString *subtitle = [NSMutableString string];
if (item.date) [subtitle appendFormat:@"%@: ", [formatter stringFromDate:item.date]];
[subtitle appendString:itemSummary];
cell.detailTextLabel.text = subtitle;
NSLog(@"FIM DO PROMOS_____________________");
}
}else if(indexPath.section == 1){
MWFeedItem *item = [itemsToDisplay objectAtIndex:indexPath.row];
if([item.category isEqualToString:@"Uncategorized"]){
NSLog(@"ENTRA NO UNCATEGORIZED__________");
NSLog(@"item.category = %@------------------>", item.category);
// Process
NSString *itemTitle = item.title ? [item.title stringByConvertingHTMLToPlainText] : @"[No Title]";
NSString *itemSummary = item.summary ? [item.summary stringByConvertingHTMLToPlainText] : @"[No Summary]";
NSLog(@"IMAGE (table View) = %@",item.image);
NSURL *url = [NSURL URLWithString:item.image];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
NSData * imageData = [NSData dataWithContentsOfURL:url];
UIImage * image = [UIImage imageWithData:imageData];
// Set
cell.imageView.image = image;
cell.textLabel.font = [UIFont boldSystemFontOfSize:15];
cell.textLabel.text = itemTitle;
NSMutableString *subtitle = [NSMutableString string];
if (item.date) [subtitle appendFormat:@"%@: ", [formatter stringFromDate:item.date]];
[subtitle appendString:itemSummary];
cell.detailTextLabel.text = subtitle;
NSLog(@"FIM DO UNCATEGORIZED________________");
}
}
return cell;
}
我遇到的问题是它为两个类别显示相同数量的单元格,并且不按类别过滤它们。
最诚挚的问候。
答案 0 :(得分:2)
当然可以。看看你的代码(以及我添加的评论):
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case 0:
return itemsToDisplay.count; // <- this
default:
return itemsToDisplay.count; // is exactly the same line of code as this one
}
}
将Uncategorized和Promos放入不同的NSArrays中。
NSArray *promos; // add all promos to this array
NSArray *uncategorized; // and eerything else into this array
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case 0:
return [promos count]; // return the number of promos
default:
return [uncategorized count]; // return the number of uncategorized objects
}
return 0;
}
答案 1 :(得分:1)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"category = %@", @"PROMOS"];
NSArray *promosArray = [itemsToDisplay filteredArrayUsingPredicate:predicate];
switch (section) {
case 0:
return [promosArray count];
default:
return [itemsToDisplay count] - [promosArray count];
}
对于细胞生成,您也应该使用这种方式。或者您可以预过滤数据(加快速度)
答案 2 :(得分:1)
那是因为您为0和1部分返回了完全相同数量的项目:return itemsToDisplay.count
此外,您还对第0和第1部分单元格使用相同的数据项:MWFeedItem *item = [itemsToDisplay objectAtIndex:indexPath.row];
您应该有2个单独的项目数组,例如itemsUncategorized
和itemsPromos
,并确保它们为您的“未分类”和“促销”列表存储不同的数据项。
或者,您可以在MWFeedItem
中指定一个标记,指定它是未分类的项目或Promos项目。这有点棘手,但也有可能接近。
示例:
typedef enum {
ITEM_UNCATEGORIZED,
ITEM_PROMOS,
} ITEM_TYPE;
@interface MWFeedItem {
@private
NSString * title;
NSString * summary;
UIImage * image;
ITEM_TYPE itemType;
}
// TODO: put your properties here for the ivars of this class...
// TODO: put your item methods here, if any...
@end