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

Posted

技术标签:

【中文标题】使用仅来自一个 NSMutableArray 的多个部分填充 tableview【英文标题】:populating tableview with multiple sections from only one NSMutableArray 【发布时间】:2014-07-30 07:00:49 【问题描述】:

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

[Home objectAtIndex:]: 无法识别的选择器发送到实例 0x109624f20 2014-07-30 12:03:24.732 TYM-APP[1704:60b] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[Home 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;

【问题讨论】:

不要在每次被要求输入单元格时查询数据库。查询一次并缓存结果。记录结果数组。有多少重复的对象和模块? 第一部分显示正确,但在所有其他部分中都重复 【参考方案1】:

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

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

然后在检索数据并将其放入数组时进行必要的逻辑分离

更新:正如@Wain 所说,不建议在cellForRowAtIndexPath: 内执行任何请求,因此最好将next sn-p 放在缓存信息的那个地方

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];

【讨论】:

我收到此错误:空数组的索引 0 超出范围'如果您不介意,我可以将我的问题编辑为新代码以向您显示代码吗? @ralph 当然,没问题。你究竟是从哪里得到这个错误的? @ralph 你忘了更新数组初始化,它现在不是二维的。将 homeArray = [[NSMutableArray alloc]init]; 更改为 homeArray = [[NSMutableArray alloc] initWithObjects:[[NSMutableArray alloc] init], [[NSMutableArray alloc] init], [[NSMutableArray alloc] init], nil]; 好的,现在我遇到了这个问题:Home objectAtIndex:]: unrecognized selector sent to instance 0x10926eca0 2014-07-30 11:01:51.337 TYM-APP[1419:60b] *** 终止应用程序到期未捕获的异常 'NSInvalidArgumentException',原因:'-[Home objectAtIndex:]: unrecognized selector sent to instance 0x10926eca0' 我认为是在这一行:homeObject = [homeArray[0] objectAtIndex:indexPath.row];【参考方案2】:

这是一个单元重用问题。

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

另一种(更简洁的)解决方案是为每个部分使用不同的自定义单元格。

另外,不要在每次要求您输入单元格时都查询数据库。查询一次并缓存结果。每次查询都非常浪费,而且会让你的应用运行速度变慢。

【讨论】:

以上是关于使用仅来自一个 NSMutableArray 的多个部分填充 tableview的主要内容,如果未能解决你的问题,请参考以下文章

UITableview 仅打印 NSMutableArray 的第一个对象,IOS

NSMutableArray filterUsingPredicate 仅超过某个索引

来自 NSArray 的 NSMutableArray

来自 NSMutableArray 的 UITableView 分组部分

将 UITextField(来自 UIAlertController)插入 NSMutableArray

来自 Flash 影片剪辑的多分辨率精灵表