0

したがって、tableViewを月/年でグループ化するような古典的な状況があります。私はconferenceというオブジェクトを持っていてbeginDateSearchStringというオブジェクトを持っていて、別のものを入れようとするのはconferenceです。私の問題は次の部分にあります。beginDate(これは日付です)によって各バケットを並べ替えるためにNSSortDescriptorを使用しません。既存のNSArrayオブジェクトプロパティを使用して、セクション化されたテーブルビュー用の新しいNSArrayを作成します。

unsortedに関連するエラーが発生しました。ソートデスクリプタタイプセレクタを受け取れません。あなたはおそらく、ソートに加えて、配列をフィルタリングする

- (NSArray *)arrayOfDateSortedEvents { 
    NSMutableArray *sortedArray = [[NSMutableArray alloc] init]; 
    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; 

    //place into buckets 

    for (WSConference *conference in self.arrayOfEvents) { 
     if (![dictionary objectForKey:[conference beginDateSearchString]]) { 
      NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:conference,nil]; 
      [dictionary setObject:array forKey:[conference beginDateSearchString]]; 
     } 
     else { 
      [[dictionary objectForKey:[conference beginDateSearchString]] addObject:conference]; 
     } 
    } 

    //sort each bucket by descriptor beginDate 

    NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"beginDate" ascending:YES]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:descriptor]; 

    for (NSMutableArray *unsorted in dictionary) { 
     [unsorted sortUsingDescriptors:sortDescriptors]; 
    } 

    // now, unkey and add dictionary in order 

    while ([dictionary count] > 0) { 

     NSString *lowest = nil; 

     for (NSMutableArray *array in dictionary) { 
      if (!lowest) 
       lowest = [[dictionary allKeysForObject:array] objectAtIndex:0]; 
      else { 
       if ([(WSConference *)[array objectAtIndex:0] beginDate] < [[dictionary objectForKey:lowest] beginDate]) 
        lowest = [[dictionary allKeysForObject:array] objectAtIndex:0]; 
      } 
     } 

     [sortedArray addObject:[dictionary objectForKey:lowest]]; 
     [dictionary removeObjectForKey:lowest]; 
    } 

    return sortedArray; 
} 

答えて

-1

はここで嫌なコードです。 NSPredicateメソッドとNSArrayメソッドを参照してください。-filteredArrayUsingPredicate:次に、フィルタによって作成されたeventArraysのeventsByDateArrayを作成します。次に、セルを作成するテーブルビューのデリゲートで、すべてが正しく順序付けされている場合、最初のセクションはeventByDateArrayの最初のオブジェクトであるeventArrayのイベントの日付を表し、テーブルの行はeventArrayのイベントで構成されます。毎日のように。

高速列挙が正しくありません。辞書のキーを列挙します。あなたのコードでは、ソートされていないキーは、列挙されている各キーと等しくなります。これは誰にとっても大きな教訓です。どのように変数をタイプするかは関係ありません。 Objective-Cがコンパイルすると、それらはすべてidに変換されます。従ってNSMutableArray *unsortedはNSMutableArrayに割り当てられていない限りNSMutableArrayではありません。 NSStringにソートされていないものを割り当てると、それはNSStringになります。辞書の高速列挙子は、キーを使用して動作します。したがって、この場合、ソートされていないものはNSStringになります。

for (NSMutableArray *unsorted in dictionary) { 
     [unsorted sortUsingDescriptors:sortDescriptors]; 
    } 

は、あなたがこれを持っている必要があります:代わりの

for (id key in dictionary) { 
    NSMutableArray *unsorted = [dictionary objectForKey:key]; 
    [unsorted sortUsingDescriptors:sortDescriptors]; 
} 
+0

そのアップ投げると、アレイは 'sortUsingDescriptors'を受信できない場合として動作し、なぜ任意のアイデア?実際には、 'NCSF string'型として報告します。 –

+0

「NCSF文字列」として何が報告されていますか?「それ」がどちらであるかわかりません。 – dbrajkovic

+0

'beginDate'プロパティは文字列かNSDateですか? – dbrajkovic