IamはiPadアプリケーションを開発しています。カスタムセルを備えたテーブルビューがあります。各セルは、クラスのプロパティを3列で表すオブジェクトです。列に基づいてデータを並べ替えたい。Objective Cを使用してそれを達成するにはどうすればよいですか?
3 に答える
NSSortDescriptorを使用してこのジョブを実行できます。
ソートが必要なアレイを準備します
NSArray *objects = [[NSArray alloc] initWithObjects:obj1, obj2, obj3, nil];
NSSortDescriptorsを使用して配列を作成します。この例では、1を使用します。DescriptorKeyには、並べ替えの基になるセルからプロパティを取得します。
NSArray *descriptor = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]];
次に、新しい配列をインスタンス化し、NSArrayからsortedArrayUsingDescriptorsインスタンスメソッドを最初の配列で呼び出し、同じオブジェクトを持つ並べ替えられた配列を返します。
NSArray *sortedArray = [objects sortedArrayUsingDescriptors:descriptor];
お役に立てれば!
私の理解では、UITableViewには「列」はありません。人々は、テーブルが列を持っているように見せるために、適切にフォーマットされたサブビューをTableViewCellに配置します。
配列をソートするには、上記のブライアンの方法を試してみてください。ソートされた配列呼び出しを取得した後
[TheTableView reloadData];
複数のNSMutableArrayと多くのカスタムセルで同様の状況が発生しました。さまざまな列に基づいて並べ替える必要があり、すべてを検索しても解決策が見つかりませんでした。だからここに私のものがあります:
列のUIButtonから、2つのパラメーター(sortwithと昇順/降順)を送信し、各「ROW」のすべての内容を辞書に保存します。
-(void)sortTheArray :(NSString *)sortWith :(BOOL)isAsc
{
sortedArray = [[NSMutableArray alloc]init];
NSDictionary *dict;
for (int i =0; i< orderArr.count; i++) {
dict = [NSDictionary dictionaryWithObjectsAndKeys:[addressArr objectAtIndex:i], @"names", [zipArr objectAtIndex:i], @"zip", [orderArr objectAtIndex:i], @"orderNo", [cityArr objectAtIndex:i], @"city", nil];
[sortedArray addObject:dict];
// NSLog(@"Sorted Array: %@", [sortedArray objectAtIndex:i]);
}
タップした列に基づいて、並べ替え記述子を使用して、作成したばかりの辞書を並べ替えます。
NSSortDescriptor *sortDescript = [[NSSortDescriptor alloc]initWithKey:sortWith ascending:isAsc];
NSArray *descriptors = [NSArray arrayWithObject:sortDescript];
NSArray *newSortedArray = [sortedArray sortedArrayUsingDescriptors:descriptors];
既存のMutable配列を再初期化して、それらがnilになるようにします。
orderArr = [[NSMutableArray alloc]init];
zipArr = [[NSMutableArray alloc]init];
addressArr = [[NSMutableArray alloc]init];
cityArr = [[NSMutableArray alloc]init];
ここで、ソートされた配列の内容を古いNSMutableArraysに追加し直し、テーブルをリロードします。
for (int i = 0; i<newSortedArray.count; i++) {
// NSLog(@"New Sorted Array is : %@", [newSortedArray objectAtIndex:i]);
orderArr = [newSortedArray valueForKey:@"orderNo"];
zipArr = [newSortedArray valueForKey:@"zip"];
addressArr = [newSortedArray valueForKey:@"names"];
cityArr = [newSortedArray valueForKey:@"city"];
}
[self.tableObject reloadData];
}
必要な場合、私のUIButtonは次のようになります。
- (IBAction)sortWithOrderNo:(id)sender;
{
if (isAscending == YES) {
[self sortTheArray:@"orderNo":YES];
isAscending = NO;
}
else
{
[self sortTheArray:@"orderNo":NO];
isAscending = YES;
}
}