动态NumberOfRowsInSection

时间:2012-02-11 12:13:36

标签: iphone objective-c ios xcode uitableview

我有一个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;
}

我遇到的问题是它为两个类别显示相同数量的单元格,并且不按类别过滤它们。

最诚挚的问候。

3 个答案:

答案 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个单独的项目数组,例如itemsUncategorizeditemsPromos,并确保它们为您的“未分类”和“促销”列表存储不同的数据项。

或者,您可以在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