indexOfObjectIdenticalTo:返回数组计数之外的值

时间:2012-07-13 10:41:53

标签: objective-c ios uitableview indexing nsmutablearray

我目前正在开发一个应用程序,该应用程序使用UITableView中的项目填充MPMediaItemCollection。我正在尝试将UITableViewCellAccessoryCheckmark添加到与当前播放曲目的标题匹配的行中。

我是通过创建一个可变数组的曲目标题来实现的,这些标题也是为我的单元格的textLabel.text属性设置的。 (用于比较目的)

注意:这一切都在- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath

中完成
MPMediaItem *mediaItem = (MPMediaItem *)[collectionMutableCopy objectAtIndex: row];

if (mediaItem) {
    cell.textLabel.text = [mediaItem valueForProperty:MPMediaItemPropertyTitle];
}



[mutArray insertObject:cell.textLabel.text atIndex:indexPath.row];

据我所知,这一切都很好,除了下面的内容。此时,我正在尝试获取当前播放曲目标题的索引,并将UITableViewCellAccessoryCheckmark添加到该行。

if (indexPath.row == [mutArray indexOfObjectIdenticalTo:[mainViewController.musicPlayer.nowPlayingItem valueForProperty:MPMediaItemPropertyTitle]]) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
}

回答我的问题,我添加了上述所有(大多数不相关的)代码,因为我对我出错的地方感到难过。当我记录indexOfObjectIdenticalTo:时,它每次吐出“2147483647”,即使数组中的对象从不超过5个。但为什么呢?

如果有人有任何提示或指示来帮我解决这个问题,我们将不胜感激!

2 个答案:

答案 0 :(得分:4)

2147483647只是意味着找不到该物体。

来自the documentation of -[NSArray indexOfObjectIdenticalTo:]

  

返回值

     

最低索引,其对应的数组值与 anObject 相同。如果数组中没有任何对象与 anObject 相同,则返回NSNotFound

NSNotFound定义为:

enum {
   NSNotFound = NSIntegerMax
};

和2147483647 = 0x7fffffff是32位iOS上的最大整数。


请注意,即使两个NSString具有相同的内容,它们也可能不是相同的对象。如果它们共享相同的位置,则两个对象是相同的,例如

NSString* a = @"foo";
NSString* b = a;
NSString* c = [a copy];

assert([a isEqual:b]);   // a and b are equal.
assert([a isEqual:c]);   // a and c are equal.
assert(a == b);          // a and b are identical.
assert(a != c);          // a and c are *not* identical.

我相信你只是想要平等测试而不是身份测试,即

if (indexPath.row == [mutArray indexOfObject:[....]]) {

答案 1 :(得分:2)

查看NSArray

的文档
  

返回值
  最低索引,其对应的数组值与anObject相同。如果数组中的任何对象都与anObject不同,则返回NSNotFound。

所以你应该做一个检查

NSInteger index = [array indexOfObjectIdenticalTo:otherObject];

if (NSNotFound == index) {
    // ... handle not being in array
} else {
    // ... do your normal stuff
}