1

SQLiteデータベースから取得したデータを表すUICollectionViewがあります。CollectionViewを上下にスクロールすると、UISwitchに問題が発生します。

-(UICollectionViewCell *)collectionView:(UICollectionView *)cv 
     cellForItemAtIndexPath:(NSIndexPath *)indexPath {

 city_setlist *cellValue = [self.arr objectAtIndex:indexPath.row];

 UISwitch *onoff=(UISwitch *) [cell viewWithTag:106];
 onoff.tag=[cellValue._id_setlist intValue];
    
 if([cellValue._was_there isEqualToString:@"1"])
     [onoff setOn:YES animated:YES];
 else
     [onoff setOn:NO animated:YES];
}

スクロールしなくてもデータは問題ありませんが、CollectionViewを上下にスクロールし始めると、UISwitchはランダムにオンになり、オフになっているはずです。その逆も同様です。私は何が間違っているのですか?

4

1 に答える 1

3

セルはタイリングビューで再利用できます。このコードは、セルが再利用されていないことを前提としているように見えます。

UISwitch *onoff=(UISwitch *) [cell viewWithTag:106];
onoff.tag=[cellValue._id_setlist intValue];

これにより、スイッチのタグが106以外に変更されると思います。これは、セルが後で再利用された場合、そのセルは106ではなくなり、一番上の行はnilを返すことを意味します。引用した2行目を削除してみてください。onoff(スクロール中に最初の行で取得した値をログに記録することで、これが問題であることを確認することもできます。)

一般に、タグの使用はちょっと厄介です。セルのサブクラスを定義し、UISwitchをプロパティに(たとえば、アウトレットを介して)接続することで、よりクリーンに感じる場合があります。

于 2013-01-13T20:24:20.023 に答える