仅使用一个NSMutableArray填充多个部分的tableview

时间:2014-07-30 07:00:49

标签: ios nsmutablearray duplicates tableview sections

这是最后一次更新。在indexpath.section == 0和== 1和== 2中设置文本时出现错误

[Home objectAtIndex:]:无法识别的选择器发送到实例0x109624f20 2014-07-30 12:03:24.732 TYM-APP [1704:60b] * 由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [主页objectAtIndex:]:无法识别的选择器发送到实例0x109624f20'

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
NSLog(@"wsolna hon");
static NSString *cellIdentifier = @"HomeTableViewCell";
HomeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

// Configure the cell...
int row= [indexPath row];


                if (indexPath.section == 0){
                     homeObject = [homeArray[0] objectAtIndex:indexPath.row];

                         NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[homeObject.News dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
                    cell.NewsDateLabel.text= homeObject.News_Date;
                    cell.NewsLabel.attributedText= attrStr;
                    NSLog(@"news: %@", attrStr);

                }


                if (indexPath.section == 1){
                    homeObject = [homeArray[1] objectAtIndex:indexPath.row];

                  NSLog(@"value of indexpath for library: %d",row);
                         NSLog(@"library: %@",homeObject.News);
                    cell.NewsLabel.text= homeObject.Library_text;
                    cell.TestimonialNameLabel.text= @"";

            }

                if (indexPath.section == 2){
                    homeObject = [homeArray[2] objectAtIndex:indexPath.row];

                         NSLog(@"news: %@",homeObject.Testimonial_Description);
                    cell.NewsLabel.text= homeObject.Library_text;
                    cell.TestimonialNameLabel.text = homeObject.Testimonial_Name;

            }


return cell;
}

2 个答案:

答案 0 :(得分:1)

如果部分数量是固定的,我建议您将数据存储在多维数组中。因此,它将在以后保护您免受大多数逻辑错误的影响。

// Declaring array for 3 sections
homeArray = [[NSMutableArray alloc] initWithObjects:[[NSMutableArray alloc] init], [[NSMutableArray alloc] init], [[NSMutableArray alloc] init], nil];

然后在检索数据并将其放入数组

期间执行必要的逻辑分离

更新:正如@Wain所说,我们不建议在cellForRowAtIndexPath:内做任何请求,因此最好将下一个代码段放在您所在的位置缓存您的信息

if ([moduleID isEqualToString:@"77"]){
    [homeArray[0] addObject:[[Home alloc]initWithItemID: modID andNewsName:nText andNewsDate: (NSString *) nDate andLibraryText: dText andTestDescription: tText andTestimonialName: (NSString *) tName]];
} else if ([moduleID isEqualToString:@"81"]){
    [homeArray[1] addObject:[[Home alloc]initWithItemID: modID andNewsName:nText andNewsDate: (NSString *) nDate andLibraryText: dText andTestDescription: tText andTestimonialName: (NSString *) tName]];
} else if ([moduleID isEqualToString:@"78"]){
    [homeArray[2] addObject:[[Home alloc]initWithItemID: modID andNewsName:nText andNewsDate: (NSString *) nDate andLibraryText: dText andTestDescription: tText andTestimonialName: (NSString *) tName]];
}

最后,以这种方式为你的表获取必要的homeObject

if (indexPath.section == 0) {
    homeObject = [homeArray[0] objectAtIndex:indexPath.row];
} else if (indexPath.section == 1) {
    homeObject = [homeArray[1] objectAtIndex:indexPath.row];
} else if (indexPath.section == 2) {
    homeObject = [homeArray[2] objectAtIndex:indexPath.row];
}

答案 1 :(得分:0)

这是一个细胞重用问题。

要修复,请确保每次从cellForRowAtIndexPath返回单元格时:始终为所有标签设置文本标签内容。这意味着明确地设置一些文本并将其他文本设置为没有文本。

替代(和清洁)解决方案是为每个部分使用不同的自定义单元格。

此外,每次要求提供单元格时都不要查询数据库。查询一次并缓存结果。每次查询都非常浪费,会让您的应用运行得更慢。