动态 NumberOfRowsInSection

Posted

技术标签:

【中文标题】动态 NumberOfRowsInSection【英文标题】:Dynamic 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;

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

最好的问候。

【问题讨论】:

【参考方案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 建议的谓词。

以上是关于动态 NumberOfRowsInSection的主要内容,如果未能解决你的问题,请参考以下文章

算法动态规划 ④ ( 动态规划分类 | 坐标型动态规划 | 前缀划分型动态规划 | 前缀匹配型动态规划 | 区间型动态规划 | 背包型动态规划 )

算法动态规划 ② ( 动态规划四要素 | 动态规划状态 State | 动态规划初始化 Initialize | 动态规划方程 Function | 动态规划答案 Answer )

算法动态规划 ② ( 动态规划四要素 | 动态规划状态 State | 动态规划初始化 Initialize | 动态规划方程 Function | 动态规划答案 Answer )

CocosCreator-如何动态加载资源

OC是动态运行时语言是什么意思?什么是动态识别,动态绑定?

动态添加/删除多个输入字段和输入行 PHP(动态表单中的动态表单)