2011-05-21 5 views
13

カスタムオブジェクトで設定されたNSArrayをソートしようとしています。各オブジェクトには、タイプNSDateのプロパティstartDateTimeがあります。NSDateプロパティでカスタムオブジェクトのNSArrayを並べ替えます。

次のコードの結果、配列はsortedEventArrayとなりますが、入力されますがソートされません。私はこれについて完全に間違った方法をしていますか?

NSSortDescriptor *dateDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"startDateTime" 
                   ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor]; 
NSArray *sortedEventArray = [nodeEventArray sortedArrayUsingDescriptors:sortDescriptors]; 
+0

コードは完全に罰金です。あなたは正しい鍵を持っていますか? –

+0

@Firoze:はい、トリプルで名前を確認しました。 "startDateTime"は、私のカスタムクラスのNSDateプロパティの名前です。 – markdorison

+2

問題は私のコードのどこかにあることが判明しましたので、質問を閉じることを検討しましたが、以下の回答の有益な性質のために、他の人が役に立つと思うので、ここに残します。 – markdorison

答えて

25

ノードイベントのstartDateTimeインスタンス変数がnilではないことを確認してください。

まだお持ちでない場合、あなたはこのような何かをし、あなたのノードのイベントオブジェクトに(カスタム)-descriptionメソッド追加される場合があります:あなたのソートコードに続いて

- (NSString *)description { 
    return [NSString stringWithFormat:@"%@ - %@", 
        [super description], startDateTime]]; 
} 

は、前の配列を記録し、

NSLog(@"nodeEventArray == %@", nodeEventArray); 
NSSortDescriptor *dateDescriptor = [NSSortDescriptor 
            sortDescriptorWithKey:@"startDateTime" 
               ascending:YES]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:dateDescriptor]; 
NSArray *sortedEventArray = [nodeEventArray 
     sortedArrayUsingDescriptors:sortDescriptors]; 
NSLog(@"sortedEventArray == %@", sortedEventArray); 

startDateTime年代はすべてnilしている場合、ソート操作がにすべて-compare:メッセージを送ると同等になるので、その前後の配列が同じ順序を(持っています:後、これは基本的に何もしません)。

11

NSDateコンパレータを指定してみましたか?

例:

NSSortDescriptor *dateDescriptor = [NSSortDescriptor 
    sortDescriptorWithKey:@"startDateTime" 
    ascending:YES 
    selector:@selector(compare:)]; 

これはNSDateクラスの正しいコンパレータの使用を強制する必要があります。

+1

この変更は私の結果に影響していないようです。 – markdorison

11

[OK]を、私はこれは少し遅れている知っているが、これは、私はそれを行うだろうかである:明らかに

NSArray *sortedEventArray = [events sortedArrayUsingComparator:^NSComparisonResult(Event *event1, Event *event2) { 
    return [event1.startDateTime compare:event2.startDateTime]; 
}]; 

、カスタムオブジェクトのクラスでイベントを交換してください。この方法の利点は、将来のリファクタリングから保護されていることです。リファクタリングしてstartDateTimeプロパティの名前を他のものに変更する場合、Xcodeはソート記述子に渡す文字列を変更しない可能性があります。突然、あなたのソートコードは何もしない/何もしません。

+0

私はあなたに同意します。しかし、ちょっとタイプミス。それは: "sortedArrayUsingComparator:" –

+0

魅力のように、ありがとうございます。 –

+0

@PaulEvans私は私のコメントに書いたとおり、[NSMutableArray sortUsingComparator:]を使用していました。しかし、私はOPの例に沿って新しいソートされた配列を返すように変更することができます。ありがとう:) – slottermoser

0

あなたはこのようにこれを達成することができ、あなたがこのように達成することができます

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:FALSE]; 

[self.Array sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
0

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"anyDateField" ascending:YES]; 

NSMutableArray *arr = [[array sortedArrayUsingDescriptors:[NSArray arrayWithObjects:descriptor,nil]]mutableCopy]; 
関連する問題