[__NSCFArray intValue]: unrecognized selector sent to instance

投稿者: Anonymous

現在カレンダーの日付をタップするとその日付のセルの色を変更させるプログラムを組んでいます。
セルをタップするとNSMutableArrayIndexPathを入れていき、cellForItemAtIndexPathでそのNSMutableArrayにあるIndexPathのセルの色を変更しています。以下のような感じです。(ちなみにセルをタップすると一度別の画面に遷移する仕様になっています。)

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    CalendarCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

    if (self.isCellSelected) {

        NSLog(@"%@", self.dateArray);

        if (self.dateArray.count != 0) {
            for (NSNumber *item in self.dateArray) {

                if (indexPath.row == [item intValue]) {
                    cell.backgroundColor = [UIColor redColor];
                }
            }
        }
    }

しかし、1つのセルの色は変更できるのですが、2つ以上のセルの色を変更しようとするとif (indexPath.row == [item intValue])の行で[__NSCFArray intValue]: unrecognized selector sent to instanceというエラーが返ってきてしまいます。…そもそもNSCFArrayってなんなのでしょうか?
エラーが出た後、上記のコードのNSLogの箇所でIndexPathを格納したNSMutableArrayのログをとってみると、以下のようになります。

(
    (
    15
  ),
  16
)

NSMutableArrayの使い方が間違っているのでしょうか?
保存は値の保存は以下のようにしています。

NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:[ud arrayForKey:@"array"], nil];
[array addObject:[NSNumber numberWithInt:self.selectedIndexPath]];

色々と調べたりしたもののどこが間違っているのかがわかりません。
どなたか分かる方がいれば教えていただきたいです。すみませんが、よろしくお願いします。

解決

NSMutableArrayのログをとって

(
    (
    15
  ),
  16
)

これが出てきた時点でおかしいと思います。
本来想定しているのは

(
  15,
  16
)

ではないですか?

NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:[ud arrayForKey:@"array"], nil];

画面遷移時にUserDefaultsにタップされたセルの情報をNSArrayで保存しているのだと思いますが、これだと2回目以降が

NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@[@1], nil];

こんな感じになるので上手く動かないのだと思います。

UserDefaultsにあったら取得してそのまま代入、なかったら通常の初期化
・まず初期化してaddObjectsFromArrayUserDefaultsの値を追加する

等の方法に変更したら上手く動くのではないでしょうか?

—– 補足 —–
[__NSCFArray intValue]: unrecognized selector sent to instanceが発生しているのはNSMutableArrayのログを見れば分かると思いますが、

for (NSNumber *item in self.dateArray) {

で取得しているitemが実際にはNSArrayなのでintValueを呼ぼうとした時に「そんなの無いよ」と言われています。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *