1

私は現在、UITableViewからのアイテムを に取り込むアプリに取り組んでいMPMediaItemCollectionます。UITableViewCellAccessoryCheckmark現在再生中のトラックのタイトルに一致する行に a を追加しようとしています。

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;
}

私の質問にたどり着くと、どこで間違ったのか困惑しているため、上記の(ほとんど無関係な)コードをすべて追加しました。配列に5つ以上のオブジェクトがないにもかかわらず、ログに記録indexOfObjectIdenticalTo:すると毎回「2147483647」が吐き出されます。しかし、なぜ?

これを修正するのに役立つヒントや指針があれば、大歓迎です!

4

2 に答える 2

4

2147483647 は、オブジェクトが見つからないことを意味します。

のドキュメント-[NSArray indexOfObjectIdenticalTo:]から:

戻り値

対応する配列値がanObjectと同一である最小のインデックス。配列内にanObjectと同一のオブジェクトがない場合は、 を返しますNSNotFound

次のようにNSNotFound定義されます。

enum {
   NSNotFound = NSIntegerMax
};

および 2147483647 = 0x7ffffffff は、32 ビット iOS の最大整数です。


2 つの NSString の内容が同じであっても、同じオブジェクトではない場合があることに注意してください。2 つのオブジェクトが同じ場所を共有している場合、それらは同一です。

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 と同一である最小のインデックス。配列内に 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 に答える