2010-06-08 47 views
1
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 

    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section]; 

    if(tempArray != nil){ 
     for (int i = 0; i < [tempArray count]; i++) 
     { 
      if([[sectionInfo indexTitle] isEqualToString:[tempArray objectAtIndex:i]]) 
     // if([sectionInfo indexTitle] == [tempArray objectAtIndex:i]) 
      { 
       NSLog(@"found"); 
       break; 
      } else 
       { 
        NSLog(@"Not found %@", [sectionInfo indexTitle]); 
        [tempArray addObject:[sectionInfo indexTitle]]; 
        NSLog(@"array %@", tempArray); 
        return [tempArray objectAtIndex:i]; 
       } 
     } 
    } 
} 

比较if语句中的字符串永远不会解析为true。样本数据有两个副本用于测试目的。注释行是一个备用,尽管我认为不正确,但试图将该部分与tempArray中的字符串进行比较。Objective-c:比较两个字符串无法正常工作

我在做什么不正确?

此外,所有的数据都是大写字母,所以比较不是低位大写。

编辑:

的NSLogs:

   NSLog(@"Not found %@", [sectionInfo indexTitle]); 
       NSLog(@"section: %d", section); 
       NSLog(@"[sectionInfo indexTitle] %@", [sectionInfo indexTitle]); 
       NSLog(@"[sectionInfo objects] %@", [[sectionInfo objects] valueForKey:@"name"]); 
       NSLog(@"array %@", tempArray); 

给我的结果:

2010-06-08 11:25:03.276 XYZApplication[5287:207] Not found Z 
2010-06-08 11:25:03.277 XYZApplication[5287:207] section: 10 
2010-06-08 11:25:03.279 XYZApplication[5287:207] [sectionInfo indexTitle] Z 
2010-06-08 11:25:03.284 XYZApplication[5287:207] [sectionInfo objects] (
    Z 
) 
2010-06-08 11:25:03.284 XYZApplication[5287:207] array (
    "" 
) 
2010-06-08 11:25:03.285 XYZApplication[5287:207] Not found A 
2010-06-08 11:25:03.285 XYZApplication[5287:207] section: 0 
2010-06-08 11:25:03.286 XYZApplication[5287:207] [sectionInfo indexTitle] A 
2010-06-08 11:25:03.286 XYZApplication[5287:207] [sectionInfo objects] (
    "Andy the Clown" 
) 
2010-06-08 11:25:03.287 XYZApplication[5287:207] array (
    "", 
    Z 
) 
2010-06-08 11:25:03.288 XYZApplication[5287:207] Not found B 
2010-06-08 11:25:03.289 XYZApplication[5287:207] section: 1 
2010-06-08 11:25:03.289 XYZApplication[5287:207] [sectionInfo indexTitle] B 
2010-06-08 11:25:03.290 XYZApplication[5287:207] [sectionInfo objects] (
    "Baseball Annie" 
) 
2010-06-08 11:25:03.291 XYZApplication[5287:207] array (
    "", 
    Z, 
    A 
) 
2010-06-08 11:25:03.291 XYZApplication[5287:207] Not found B 
2010-06-08 11:25:03.292 XYZApplication[5287:207] section: 2 
2010-06-08 11:25:03.292 XYZApplication[5287:207] [sectionInfo indexTitle] B 
2010-06-08 11:25:03.293 XYZApplication[5287:207] [sectionInfo objects] (
    "Baseball Bugs" 
) 
2010-06-08 11:25:03.293 XYZApplication[5287:207] array (
    "", 
    Z, 
    A, 
    B 
) 
2010-06-08 11:25:03.294 XYZApplication[5287:207] Not found D 
2010-06-08 11:25:03.295 XYZApplication[5287:207] section: 3 
2010-06-08 11:25:03.295 XYZApplication[5287:207] [sectionInfo indexTitle] D 
2010-06-08 11:25:03.296 XYZApplication[5287:207] [sectionInfo objects] (
    "" 
) 
2010-06-08 11:25:03.296 XYZApplication[5287:207] array (
    "", 
    Z, 
    A, 
    B, 
    B 
) 
2010-06-08 11:25:03.296 XYZApplication[5287:207] Not found E 
2010-06-08 11:25:03.304 XYZApplication[5287:207] section: 4 
2010-06-08 11:25:03.305 XYZApplication[5287:207] [sectionInfo indexTitle] E 
2010-06-08 11:25:03.306 XYZApplication[5287:207] [sectionInfo objects] (
    E 
) 
2010-06-08 11:25:03.306 XYZApplication[5287:207] array (
    "", 
    Z, 
    A, 
    B, 
    B, 
    D 
) 
2010-06-08 11:25:03.307 XYZApplication[5287:207] Not found F 
2010-06-08 11:25:03.307 XYZApplication[5287:207] section: 5 
2010-06-08 11:25:03.308 XYZApplication[5287:207] [sectionInfo indexTitle] F 
2010-06-08 11:25:03.310 XYZApplication[5287:207] [sectionInfo objects] (
    Frank 
) 
2010-06-08 11:25:03.310 XYZApplication[5287:207] array (
    "", 
    Z, 
    A, 
    B, 
    B, 
    D, 
    E 
) 
2010-06-08 11:25:03.311 XYZApplication[5287:207] Not found H 
2010-06-08 11:25:03.311 XYZApplication[5287:207] section: 6 
2010-06-08 11:25:03.312 XYZApplication[5287:207] [sectionInfo indexTitle] H 
2010-06-08 11:25:03.313 XYZApplication[5287:207] [sectionInfo objects] (
    H 
) 
2010-06-08 11:25:03.313 XYZApplication[5287:207] array (
    "", 
    Z, 
    A, 
    B, 
    B, 
    D, 
    E, 
    F 
) 
2010-06-08 11:25:03.314 XYZApplication[5287:207] Not found J 
2010-06-08 11:25:03.315 XYZApplication[5287:207] section: 7 
2010-06-08 11:25:03.315 XYZApplication[5287:207] [sectionInfo indexTitle] J 
2010-06-08 11:25:03.316 XYZApplication[5287:207] [sectionInfo objects] (
    J 
) 
2010-06-08 11:25:03.316 XYZApplication[5287:207] array (
    "", 
    Z, 
    A, 
    B, 
    B, 
    D, 
    E, 
    F, 
    H 
) 
2010-06-08 11:25:03.317 XYZApplication[5287:207] Not found J 
2010-06-08 11:25:03.317 XYZApplication[5287:207] section: 8 
2010-06-08 11:25:03.329 XYZApplication[5287:207] [sectionInfo indexTitle] J 
2010-06-08 11:25:03.330 XYZApplication[5287:207] [sectionInfo objects] (
    Joe 
) 
2010-06-08 11:25:03.330 XYZApplication[5287:207] array (
    "", 
    Z, 
    A, 
    B, 
    B, 
    D, 
    E, 
    F, 
    H, 
    J 
) 
2010-06-08 11:25:03.335 XYZApplication[5287:207] Not found L 
2010-06-08 11:25:03.336 XYZApplication[5287:207] section: 9 
2010-06-08 11:25:03.336 XYZApplication[5287:207] [sectionInfo indexTitle] L 
2010-06-08 11:25:03.337 XYZApplication[5287:207] [sectionInfo objects] (
    L 
) 
2010-06-08 11:25:03.337 XYZApplication[5287:207] array (
    "", 
    Z, 
    A, 
    B, 
    B, 
    D, 
    E, 
    F, 
    H, 
    J, 
    J 
) 
+0

你能使用的NSLog打印出来的字符串的副本吗?可能有多种原因:额外的空格,不同的编码等。 – Emil 2010-06-08 15:22:44

+0

循环永远不会超过第一次迭代。为什么它是一个循环? – drawnonward 2010-06-08 15:33:37

回答

1

tempArray的第一个元素似乎总是一个空字符串。在你的日志中,[sectionInfo indexTitle]永远不会是一个空字符串。

由于您在第一次找不到东西时退出该方法,您永远无法获得真正的比较结果。

另外我注意到你没有找到[sectionInfo indexTitle]添加到你tempArray的每一次迭代,你没有找到它。这是你真正想要的吗?

此外,如果你曾经找到过匹配,那么你不会返回任何东西。你应该得到一个编译器警告,说该方法并不总是返回一个值。

我是一种猜测这里,但我想你想是这样的:

for (int i = 0; i < [tempArray count]; i++) // NB [nil count] returns 0 so your test for a nil tempArray is unnecessary 
    { 
     if([[sectionInfo indexTitle] isEqualToString:[tempArray objectAtIndex:i]]) 
     { 
      NSLog(@"found"); 
      return [tempArray objectAtIndex:i]; 
     } 
     else 
     { 
      NSLog(@"Not found %@", [sectionInfo indexTitle]); 
      NSLog(@"array %@", tempArray); 
     } 
    } 
    [tempArray addObject:[sectionInfo indexTitle]]; 
    return ???? // I don't know what you want returned in this case: 

编辑为下面的评论:

我想我终于明白你正在尝试做的:

如果您已经有一个栏目标题与您现在即将交付的栏目标题相同,则您希望返回零,因此该栏目没有标题。在这种情况下,代码应该是这样的:

for (int i = 0; i < [tempArray count]; i++) // NB [nil count] returns 0 so your test for a nil tempArray is unnecessary 
    { 
     if([[sectionInfo indexTitle] isEqualToString:[tempArray objectAtIndex:i]]) 
     { 
      NSLog(@"found"); 
      return nil; 
     } 
     else 
     { 
      NSLog(@"Not found %@", [sectionInfo indexTitle]); 
      NSLog(@"array %@", tempArray); 
     } 
    } 
    [tempArray addObject:[sectionInfo indexTitle]]; 
    return [sectionInfo indexTitle]; 

可以使用的NSMutableSet代替:

if ([tempSet containsObject: [sectionInfo indexTitle]]) 
{ 
    return nil; 
} 
else 
{ 
    [tempSet addObject: [sectionInfo indexTitle]]; 
    return [sectionInfo indexTitle]; 
} 
+0

这似乎到目前为止虽然不是100%,但我试图做的是按字母顺序对我的tableview进行分组,数据来自SQLite数据库;不知道是否这使得我有了一个合适的数组“tempArray”没有重复,但它不能在tableview中正确显示,tableview只显示AB和J,并且每个都有重复的条目。 g通过各自的第一个字母细胞? – 2010-06-08 16:11:44

+0

这两段代码都会产生相同的结果。他们似乎为每个单元添加一个节标题。你有没有参考指出我要弄清楚如何分组细胞? – 2010-06-08 16:34:40

+0

当你调用这个方法的时候,表视图的结构已经决定了。您的分组逻辑需要在您的-numberOfSectionsInTableView实现中实现:-tableView:numberOfRowsInSection:以下链接应该可以帮助您使用这些内容:http://developer.apple.com/iphone/library/documentation/UserExperience/概念/ TableView_iPhone/CreateConfigureTableView/CreateConfigureTableView.html#// apple_ref/DOC/UID/TP40007451-CH6-SW5 – JeremyP 2010-06-09 07:26:39

1

你肯定在tempArray对象是真的NSStringisEqualToString只会返回false,如果他们是某种其他类型。

另外,你可以在字符串中追踪空格吗?

+0

tempArray是一个用@“”空字符串初始化的NSMutableArray。数组中只有一个条目。 tempArray仅用作已添加头的记录。唯一添加的项目是单个字母“部分索引的” – 2010-06-08 15:39:34

2

当第一个元素不匹配时,else分支中的return将中止搜索。如果第一个元素是一个匹配项,那么'then'分支将跳出循环(我猜有更多的代码为这种情况提供返回值?)。

也许return应该替换'then'分支中的break

另外,既然你已经有了你想要的字符串[sectionInfo indexTitle],为什么手工搜索呢?你只需要检查它是否在列表中?也许像这样而不是循环:

if ([tempArray containsObject: [sectionInfo indexTitle]]) { 
    return [sectionInfo indexTitle]; 
} else { 
    return @"<invalid>"; // or whatever 
} 
+0

这似乎会导致无限循环。从逻辑上讲,我不确定为什么。 – 2010-06-08 15:36:42

+0

@Mr:很明显,如果你想搜索整个数组,如果第一个数组不匹配,你就不应该中止。你确定修改过的循环是“无限”吗?它肯定会为每个调用“喷出”更多“未找到”日志。 – 2010-06-08 15:55:36

+1

当只测试一个对象的存在时,我宁愿'containsObject:'over'indexOfObject:'。 – Nefrubyr 2010-06-08 15:57:44