2012-01-18 12 views
0

以下は、月別に注文したいUITableViewのスクリーンショットです。現在、アルファベット順の小文字の最初の文字で順序付けられていますが、イベントを数か月以内に注文するにはどのようなコードを使用しますか?セクションのオブジェクトを注文する

Image to be ordered

感謝すべてのヘルプ、

セブ

答えて

1

最善の解決策は、あなたのデータモデルがどのように見えるかに依存します(ちなみに私はセクションを注文する方法を働いています)。おそらく最もシンプルで効率的な方法は、データモデルが頻繁に変更されないことを前提に、各セクションのデータを必要な順序(各アイテムの日付に基づいて)にソートするルーチンだけです。あなたのデータ構造の詳細に応じてポインタのリストを作成してください。セクションのソートされたインデックス構造の行インデックスを検索し、その要素のデータをcellForRowAtIndexPathに表示するだけです。

最適化するには、データ構造内のブール型の「ソート」フィールドを保持し、データがテーブル内で突然変異するたびにfalseに設定し、cellForRowAtIndexPathでオンデマンドでソートし、「ソート済み」をtrueに設定します。

EDIT:より多くのステップバイステップの詳細な説明を要求

OKは、ここにあなたのセクションのそれぞれは、NSMutableArrayのようなソート可能な容器にソートされていない保存されていると仮定すると、私はそれについて移動したい方法についてもう少し詳細です。繰り返しますが、最適な解決方法は、セクションエントリの更新頻度やデータの構成方法など、アプリケーションの詳細によって異なります。セクションのエントリ数などの上限があります。これは私のオリジナルの提案とは少し異なりますセクションのデータコンテナが直接ソートされ、外部注文インデックスは使用されません。

セクション内のエントリを追加、変更、または削除される場合には、あなたのデータモデルに近いどこかに便利NSMutableSet sortedSectionsメンバー、(あなたはクラスでそれを定義した場合、そのクラス内最高のだろう)

// a section number is sorted if and only if its number is in the set 
NSMutableSet *sortedSections; 

を追加します。あなたのcellForRowAtIndexPath

// just added, deleted, or changed a section entry entry 
unsigned int sectionNum; // this section changed 
... 
NSNumber *nsNum = [NSNumber numberWithUnsignedInt:sectionNum]; 
[obj.sortedSections removeObject:nsNum]; 

セットからその番号を削除することによってソートされていないとして、(これは、このチェックに最適な場所ではないかもしれないが、それは高速でチェックされ、取得する最も簡単な場所でそのセクションをマークソート作業)、チェックセクションがソートされている場合ここで

unsigned int sectionNum = [indexPath section]; 
NSNumber *nsNum = [NSNumber numberWithUnsignedInt:sectionNum]; 
if ([obj.sortedSections containsObject:nsNum]) 
    // already sorted, nothing to do 
else 
{ 
    // section needs to be resorted and reloaded 
    [mySectionData sortUsingFunction:compareSectionEntriesByDate context:nil]; 
    // mark the section as sorted now 
    [obj.sortedSections addObject:nsNum]; 
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationNone]; 
} 

は、あなたのエントリ構造がタイプNSDictionaryのであり、NSDateは(自分で定義する)キー定数kEntryNSDateで

// sort compare function for two section entries based on date 
// 

static int compareSectionEntriesByDate(id e1, id e2, void *context) 
{ 
    NSDictionary *eDict1 = (NSDictionary *) e1; 
    NSDictionary *eDict2 = (NSDictionary *) e2; 
    NSDate *date1 = [eDict1 objectForKey:kEntryNSDate]; 
    NSDate *date2 = [eDict2 objectForKey:kEntryNSDate]; 

    int rv = [date1 compare:date2]; 
    return rv; 
} 

をオブジェクトとして、あなたが日付を格納することを想定し、機能をソートする例です。それはあなたに幸運をもたらすのに十分な詳細でなければなりません!

+0

ありがとうSOOOO! –

関連する問題