2012-02-11 12 views
0

私はrssフィードであるxmlファイルから "カテゴリ"フィールドを読み取るiPhoneアプリケーションを持っています。私のアプリケーションの仕組みは、rssフィードのコンテンツをxmlの "category"フィールドのカテゴリ別に表形式で表示することです。Dynamic NumberOfRowsInSection

私はtableviewsに少し新しいので、少し失われます。

xmlファイルには2つのカテゴリがあり、1つは「Uncategorized」と呼ばれ、もう1つは「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
- (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]; 
} 

あなたもこの方法を使用する必要があります。それとも、(スピードアップのために)あなたは両方の0と1のセクションの項目の正確に同じ数を返すためだ

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

は異なる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

データをプレフィルタすることができます: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 
+0

彼はすでに "フラグ" を使用しています。彼のカテゴリプロパティは、オブジェクトがプロモーションであるか、それともカテゴリ化されていないかを示します( '[item.category isEqualToString:@" PROMOS "]')。この旗だけでは彼を助けません。 –

+0

あなたは正しいです、アイテムにフラグを使用することに加えて、それらの未分類と宣伝アイテムを除外する必要があります。例として、述部を@NeverBeとして使用することが以下に示唆されています。 – oradyvan