データを並べ替える UITableView を持つ UISegmentControl があります。私は物事を行うことができるようにしたい:
(1) デフォルトの並べ替え (ユーザーが初めてアプリをオンにすると、最初のセグメントが選択され、そのアクションで並べ替えられます)
(2)ユーザーがテーブルロードの間にいた場所を覚えています。これが意味することは、Apple のカバーフローと同様に、別のカバーに移動すると、UITableView が再作成されるということです。そのため、ユーザーが最後にそこにいた場合、並べ替えは 3 番目のセグメントにあり、それを覚えています。
私はオブジェクト指向設計に少し慣れていません。これは、どこにでも同じ冗長なコードがないようにするための最良の推測でした: (MarkersList は NSMutableArray です)
- (NSArray *)sortByName:(NSArray *)sortDescriptors {
return [self.MarkersList sortedArrayUsingDescriptors:sortDescriptors];
}
- (NSArray *)sortByRSID:(NSArray *)sortDescriptors {
return [self.MarkersList sortedArrayUsingDescriptors:sortDescriptors];
}
- (void)setSortedMarkersList:(NSArray *)sortedArray {
if (self.MarkersList != nil) {
[self.MarkersList removeAllObjects];
}
[self.MarkersList addObjectsFromArray:sortedArray];
}
- (IBAction)sortButtonPressed:(UISegmentedControl *)segmentControl {
// Create sort descriptors
NSSortDescriptor *nameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
NSSortDescriptor *rsID = [[NSSortDescriptor alloc] initWithKey:@"ID" ascending:YES];
if ([segmentControl selectedSegmentIndex] == NAME) { // this is #define 0
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:nameDescriptor, rsIDDescriptor, nil];
NSArray *sortedArray = [self sortByGene:sortDescriptors];
[self setSortedMarkersList:sortedArray];
[sortDescriptors release];
}
else if ([segmentControl selectedSegmentIndex] == RS_ID) {
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:rsIDDescriptor, resultDescriptor, nameDescriptor, nil];
NSArray *sortedArray = [self sortByRSID:sortDescriptors];
[sortDescriptors release];
[self setSortedMarkersList:sortedArray];
}
[self.MarkersTableView reloadData];
}
他の 2 つのような NSString や NSNumber だけではないため、3 番目の並べ替えはまだ実装していません。これまでのところ、正しく機能していると思います。ただし、問題は (1) を実装することです。テーブルが読み込まれるときに sortByName を呼び出す必要があります。NSSortDescriptors をもう一度作成することもできますが、それは冗長なようです。これを達成するためのよりOODの方法はありますか?
(2) については、そのテーブルのインデックスを辞書に保存し、そのテーブルが読み込まれたときにそれを取得できると思います。または、それらの線に沿った何か、よくわかりません。
どんな助けでも大歓迎です。ありがとう!