10928


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

[code]

    - (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];
                    }
                }
            }
        }
    
[/code]

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

[code]

    (
        (
        15
      ),
      16
    )
    
[/code]

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

[code]

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

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


CC BY-SA 3.0
2015-06-03T01:38:06.910
10921
2015-06-03T03:11:47.867
5210
question
objective-c uicollectionview
[__NSCFArray intValue]: unrecognized selector sent to instance


`NSMutableArray`のログをとって

[code]

    (
        (
        15
      ),
      16
    )
    
[/code]

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

[code]

    (
      15,
      16
    )
    
[/code]

ではないですか？

[code]

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

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

[code]

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

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

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

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

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

[code]

    for (NSNumber *item in self.dateArray) {
    
[/code]

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


CC BY-SA 3.0
2015-06-03T02:50:12.383
10928
2015-06-03T03:05:33.433
2015-06-03T03:05:33.433
3516
3516
10921
answer

[code]

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

これの1行目を

[code]

    NSMutableArray *array = [[ud arrayForKey:@"array"] mutableCopy];
    
[/code]

に変更すれば、とりあえず原因はわからなくても、解決はすると思います。  
原因解明については、別回答者さんの説明が詳しいので、ここでは触れません。

> そもそもNSCFArrayってなんなのでしょうか？

それは「Objective-C **クラスクラスタ** 」をキーワードにして、ネット検索してください。Objective-
Cのクラスの構造は、あなたが想像している以上に、複雑な構造をしていることを、知ることができるでしょう。  
（「NSCFArray」じゃなくて、「__NSCFArray」です。）


CC BY-SA 3.0
2015-06-03T03:11:47.867
10929
2015-06-03T03:11:47.867
7362
10921
answer