0
votes

I have an iphone App that reads the "category" field from the xml file that is a rss feed. The way my App works is that it displays the content of the rss feed in a table view by categories from the xml "category" field.

Im a bit new to tableviews so im a bit lost.

I just have 2 categories on the xml file, one called "Uncategorized" and another called "Promos".

The current code is:

- (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;
}

The problem i have is that it displays the same number of cells for both categories and doesn't filter them by Categories.

Best Regards.

3

3 Answers

1
votes
- (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];
}

For cell generation you should use this way too. Or you can prefilter data (for speed up)

2
votes

of course it does. Look at your code (and the comments I added):

- (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
    }
}

put Uncategorized and Promos into different 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
votes

that's because you return exactly the same number of items for both 0 and 1 sections: return itemsToDisplay.count

Moreover, you also use the same data item for both section 0 and 1 cells: MWFeedItem *item = [itemsToDisplay objectAtIndex:indexPath.row];

You should either have 2 separate arrays of items, for example, itemsUncategorized and itemsPromos and make sure they store different data items for your "Uncategorized" and "Promos" lists.

Or, you can implement a flag iniside your MWFeedItem specifying wheteher it is an Uncategorized item or Promos item. This is a bit trickier, but alos possible approach.

Example:

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