0

データを並べ替える 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) については、そのテーブルのインデックスを辞書に保存し、そのテーブルが読み込まれたときにそれを取得できると思います。または、それらの線に沿った何か、よくわかりません。

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

0

iOS では問題を解決するために常にベスト プラクティスを使用できるとは限らないため、これは OO の質問ではありません。あなたの状況に最適な方法は、選択した並べ替えに関する情報をNSUserDefaultsに保存することだと思います。-viewDidLoad メソッドで、選択した並べ替えオブジェクトが NSUserDefaults に存在するかどうかを確認し、存在する場合はそれを使用し、存在しない場合は適切なデフォルト値を選択します。

アプリケーションのロードごとに NSSortDescriptors を作成することについて心配する必要はありません。NSSortDescriptor のシリアライズとデシリアライズは、必要に応じて再作成するよりもはるかに非効率的です。Apple は、NSSortDescriptor のような頻繁に使用されるクラスの最適化に多くの時間を費やしています。

#2 に関しては、UITableView で indexPathsOfVisibleRows を使用して、表示可能なインデックスの配列を取得し、最初のインデックスを UserDefaults に格納してから、ロード (または発生した場合は次のビュー コントローラーからポップ) 時に –scrollToRowAtIndexPath:atScrollPosition:animated: を呼び出すことができます。

コードが機能するようになったら、プロファイリングとインストゥルメントに関する iTunes U のさまざまなビデオを見ることをお勧めします。これは見落とされがちな素晴らしいツールであり、必要なところに労力を集中させるのに本当に役立ちます.

于 2011-06-24T00:26:19.727 に答える