我目前正在开发一个应用程序,该应用程序使用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个。但为什么呢?
如果有人有任何提示或指示来帮我解决这个问题,我们将不胜感激!
答案 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
}