动态 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 个单独的项目数组,例如,itemsUncategorized
和 itemsPromos
,并确保它们为您的“未分类”和“促销”列表存储不同的数据项。
或者,您可以在 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 )