【问题标题】:Dynamic NumberOfRowsInSection动态 NumberOfRowsInSection
【发布时间】:2012-02-11 12:13:35
【问题描述】:

我有一个 iphone 应用程序,它从作为 rss 提要的 xml 文件中读取“类别”字段。我的应用程序的工作方式是它在表格视图中按 xml“类别”字段中的类别显示 rss 提要的内容。

我对 tableviews 有点陌生,所以我有点迷茫。

我在 xml 文件中只有 2 个类别,一个名为“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;
}

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

最好的问候。

【问题讨论】:

    标签: iphone objective-c ios xcode uitableview


    【解决方案1】:

    当然可以。查看您的代码(以及我添加的 cmets):

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

    【讨论】:

      【解决方案2】:
      - (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];
      }
      

      对于细胞生成,您也应该使用这种方式。或者您可以预过滤数据(以加快速度)

      【讨论】:

        【解决方案3】:

        这是因为您为 0 和 1 部分返回完全相同数量的项目:return itemsToDisplay.count

        此外,您还为第 0 节和第 1 节单元格使用相同的数据项:MWFeedItem *item = [itemsToDisplay objectAtIndex:indexPath.row];

        您应该有 2 个单独的项目数组,例如,itemsUncategorizeditemsPromos,并确保它们为您的“未分类”和“促销”列表存储不同的数据项。

        或者,您可以在 MWFeedItem 中实现一个标志,指定它是未分类项目还是促销项目。这有点棘手,但也是可能的方法。

        例子:

        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
        

        【讨论】:

        • 他已经使用了一个“标志”。他的类别属性表示一个对象是促销还是未分类 ([item.category isEqualToString:@"PROMOS"])。光是这面旗帜根本帮不上他的忙。
        • 你是对的,除了在item中使用flag之外,还需要过滤掉那些Uncategorized和Promotional items。例如,使用如下@NeverBe 建议的谓词。
        猜你喜欢
        • 1970-01-01
        • 2012-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多