9

NSTableView には、名前と給与として 5 ~ 10 の値を持つ 2 つの列があります。両方の列のヘッダーをクリックした後、これらの列を並べ替えたいと思います。インターネットにはたくさんのデータが存在しますが、私はこれらを使用できません。ココアでこれを行うのを手伝ってください。

事前に感謝し、助けに感謝します。

4

4 に答える 4

17

各テーブル列にはメソッドsetSortDescriptorPrototype があります。並べ替え記述子は、配列にそれ自体を並べ替える方法(昇順、降順、大文字と小文字を区別しないなど)を指示する方法です。並べ替え可能として必要な各列を繰り返し、これらの各列でこのメソッドを呼び出して、渡します。必要なソート記述子(私の場合は列識別子を使用します)

for (NSTableColumn *tableColumn in tableView.tableColumns ) {

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:tableColumn.identifier ascending:YES selector:@selector(compare:)];
    [tableColumn setSortDescriptorPrototype:sortDescriptor];
}

この初期化コードを記述した後、ソート記述子が変更されるたびに通知するNSTableViewDataSourceメソッドがあり、このメソッドをデータソースに実装し、データ配列にメッセージを送信してそれ自体をソートします- (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors

- (void)tableView:(NSTableView *)aTableView sortDescriptorsDidChange:(NSArray *)oldDescriptors
{
    self.data = [self.data sortedArrayUsingDescriptors:sortDescriptors];
    [aTableView reloadData];
}

このメソッドは、列ヘッダーがクリックされるたびに起動されNSTableColumn、並べ替え順序を示す小さな三角形が表示されます。

于 2012-06-29T08:35:14.593 に答える
7

同様のものを実装する最も簡単な方法を探しているときに、この質問に出くわしました。元の質問は古いですが、誰かが私の答えを役に立てば幸いです! 私はXcode 5.1.1を使用していることに注意してください

これを行うには、次のことが必要です。

  1. テーブルで並べ替える実際の列を選択します。
  2. Attributes Inspector で、Sort Key と Selector の 2 つのフィールドに入力する必要があります。
  3. [ソート キー] フィールドに、識別子の値を入力する必要があります。識別子の値は、Identity Inspector にあります。
  4. Selector フィールドでは、列のオブジェクト タイプに基づいて適切なセレクター メソッドを入力する必要があります。デフォルトの方法は次のとおりです。比較:

Mac 用テーブル ビュー プログラミング ガイドに基づいています。compare: メソッドは、NSString、NSDate、および NSNumber オブジェクトで機能します。テーブルの列に文字列のみが含まれている場合、大文字と小文字の区別が重要でない場合は、caseInsensitiveCompare: メソッドの使用を検討することをお勧めします。ただし、ユーザーの言語要件を考慮して、これらのメソッド シグネチャを localizedCompare: または localizedCaseInsensitiveCompare: メソッドに置き換えることを検討してください。

最後に、以下に示す形式で、Table View Controller で tableView:sortDescriptorsDidChange: メソッドを宣言する必要があります。

-(void)tableView:(NSTableView *)mtableView sortDescriptorsDidChange:(NSArray *)oldDescriptors
{
    [listArray sortUsingDescriptors: [mtableView sortDescriptors]];
    [tableView reloadData];
}
于 2014-06-05T12:41:55.317 に答える