iOS indexOfObjectIdenticalTo:问题

时间:2011-11-02 21:54:58

标签: objective-c ios indexing

我有两个数组,每个数组都包含字符串。第一个数组是单词列表,第二个数组包含不同语言单词的替代。

匹配数组,使得第二个数组中索引n处的单词是第一个数组中索引n处单词的翻译。

单词及其翻译显示在表格视图中。用户可以通过在搜索字段中输入文本来过滤表格视图。完成后,我从第一个数组创建一个过滤的数组,如下所示:

- (void)filterContentForSearchText:(NSString*)searchText

[self.filteredarray removeAllObjects]; 
[firstarray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
 {
     if ([obj compare:searchText options:NSCaseInsensitiveSearch range:NSMakeRange(0, [searchText length])] == NSOrderedSame)
     {
         idx= [firstarray indexOfObjectIdenticalTo:obj];
         NSUInteger maxindex = idx + 50;
         for (idx ; (idx < [firstarray count] && idx <= maxindex && idx!= NSNotFound); idx ++)
         {
             [self.filteredarray addObject:[firstarray objectAtIndex: idx]];
         }
         *stop = YES;
     }
 }];     

然后,当我在表视图中显示值时,我使用以下代码。这是我的cellForRowAtIndexPath方法的一个exerpt。我试图使用已添加到过滤数组的对象从原始数组中获取索引。

contentForThisRow = [self.filteredarray objectAtIndex:row];
NSUInteger index = [self.firstarray indexOfObjectIdenticalTo:contentForThisRow];
contentForThisRow2 = [self.secondarray objectAtIndex:index];

这适用于模拟器,但在设备上我有时会从第二个数组中重复相同的条目。例如,我的第一个数组在索引x,y和z处连续三次包含单词“hello”。我的第二个数组包含“hei”,“heisan”和“hoppsan”,它们都是索引x,y和z的“hello”的翻译。

在模拟器上,我得到三个单元格,每个单元格都有不同的翻译。在设备上,我得到三个单元格,都是“hei”,第一个翻译。所有重复翻译都不会发生这种情况。

为什么会发生这种情况,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

我认为问题在于iOS(在设备上)可能在某处使用与NSString或NSArray中的模拟器略有不同的优化。这是猜测。

indexOfObjectIdenticalTo:返回与您传入的对象具有相同内存地址的第一个对象的索引。在构建过滤后的数组时,手机上似乎重新使用了第一个数组中相同的字符串对象(甚至可能在构建firstArray时,所以每次都得到相同的索引值。

更好的解决方案是将过滤后的数组构建为字典数组,并在此时存储firstArray和secondArray的正确索引中的值。然后,您可以在填充单元格时直接使用这些值,而不是再次搜索两个数组。这也应该具有一些性能优势。

您可以使用以下代码实现此目的。首先,在构建过滤后的数组时,在循环内部,而不是从firstarray添加对象,执行以下操作:

[self.filteredArray addObject:[NSDictionary dictionaryWithObjectsAndKeys:[firstarray objectAtIndex:idx],@"english",[secondarray objectAtIndex:idx],@"translated",nil];

然后,在您的cellForRowAtIndexPath中,获取两个内容变量:

NSDictionary *rowData = [self.filteredarray objectAtIndex:row];
contentForThisRow = [rowData objectForKey:@"english"];
contentForThisRow2 = [rowData objectForKey:@"translated"];

甚至更好的解决方案是首先保存这样的数据,而不是试图保持两个独立的数组同步。我想如果你想在你的两个单独的文件中添加或改变任何东西,你可以快速地将它们逐步推出。但是,我觉得我已经做好了一天......

答案 1 :(得分:0)

else

contentForThisRow = [self.firstarray objectAtIndex:row];
contentForThisRow2 = [self.secondarray objectAtIndex:row];

你看错了吗?