苦戦したので、メモがてら残します。
もっといい方法があると思いますが。。。
得点など(float値)の保存
値を格納するarrayに初期値を登録する。
これをやらないと、呼び出すときにエラーになる模様。
objective-c
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *defaults = [NSMutableDictionary dictionary];
NSArray *testArray=[NSArray array];
[defaults setObject:testArray forKey:@"RECORDS"];
[ud registerDefaults:defaults];
今回の得点などを追加する
NSUserDefaultsにはNSMutableArrayは保存できないようなので
保存するのはあくまでNSArray。
ゲーム終了時に今回の得点などをarrayに追加して再保存するのですが
そのために一旦mutableCopyする必要があります。
objective-c
NSArray *recordArray =[ud objectForKey:@"RECORDS"];
NSMutableArray *mutableRecordArray= [[NSMutableArray alloc]init];
mutableRecordArray = [recordArray mutableCopy];
[mutableRecordArray addObject:[NSNumber numberWithFloat:score]];
//scoreは今回の結果
recordArray=[mutableRecordArray copy];
//NSArrayに戻して再保存
[ud setObject:recordArray forKey:@"RECORDS"];
最高記録のランキングを表示する
保存してあるarrayを取り出してソートします。
float値のソート方法はこちらで教えてもらいました。
こちらを参考に
intをfloatに換えて
objective-c
NSArray *sorted_array = [recordArray sortedArrayUsingComparator:^NSComparisonResult(NSNumber *a, NSNumber *b) {
return b.floatValue - a.floatValue; // ソート
}]; //ダメな例
とかも試してみたんですが、何故かダメでした。
(数値が5つぐらいになるとランキングが前後する)
ちなみに今回の値を表示させたい場合はソートする前のarrayの
最後の値を取ってくればいいのでlastObjectメソッドが使えます。
objective-c
NSArray *recordArray=[ud objectForKey:@"RECORDS"];
//float score =[[recordArray lastObject]floatValue];
NSArray *sorted_array =[recordArray sortedArrayUsingSelector:@selector(compare:)];
あとはsorted_arrayから順番に取り出せば
ランキングが作成できます。