1

我目前正在开发一个应用程序,该应用程序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 个。但为什么?

如果有人有任何提示或指示可以帮助我解决此问题,将不胜感激!

4

2 回答 2

4

2147483647 只是表示找不到对象。

以下文档-[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:[....]]) {
于 2012-07-13T10:46:54.243 回答
2

查看NSArray的文档

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

所以你可能应该做一个检查

NSInteger index = [array indexOfObjectIdenticalTo:otherObject];

if (NSNotFound == index) {
    // ... handle not being in array
} else {
    // ... do your normal stuff
}
于 2012-07-13T10:52:17.250 回答