1

カスタム オブジェクトの配列を並べ替えようとすると問題が発生します。私の配列がソートコードにヒットしていないかのように見えますが、単に配列自体を返すだけです。

私は次の設定をしています:

SearchResult : NSObject
--
Document : SearchResult
Tag : SearchResult
Folder : SearchResult

私のコードは s として戻り値を取得し、それらすべてを実装で定義されてSearchResultいるキーと比較しようとしています。nameSearchResult

-(void) parseFolderContents:(NSDictionary *) data
{
NSMutableArray *searchResults = [[NSMutableArray alloc] init];
NSMutableArray *documents = [[NSMutableArray alloc] init];
NSMutableArray *folders = [[NSMutableArray alloc] init];
NSMutableArray *tags = [[NSMutableArray alloc] init];
NSArray *results = [data objectForKey:@"items"];
for (int i = 0; i < [results count]; i++)
{
    SearchResult *result = (SearchResult *)[KTParser parseSearchResult:[results objectAtIndex:i]];
    if ([result.type isEqualToString:@"document"]){
        [documents addObject:result];
    }
    else if ([result.type isEqualToString:@"folder"])
    {
        [folders addObject:result];
    }
    else if ([result.type isEqualToString:@"tag"])
    {
        [tags addObject:result];
    }
}
if ([documents count] > 0)
    [searchResults addObject:documents];
if ([folders count] > 0)
    [searchResults addObject:folders];
if ([tags count] > 0)
    [searchResults addObject:tags];

....

これは、配列に値を設定するために使用されるコードであり、特別なことではありません。これらの方法をそれぞれ試して、配列を比較しました。どれも機能していません。誰かが私が間違っている場所を知っていますか?

最初の試み:

NSSortDescriptor *sortDescriptor;
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name"
                                             ascending:YES];    
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *sortedResults;
sortedResults = [searchResults sortedArrayUsingDescriptors:sortDescriptors];

2 回目の試行:

NSArray *sortedResults;
sortedResults = [searchResults sortedArrayUsingSelector:@selector(compare:)];

(implementing custom compare method on SearchResult/Document.m)
- (NSComparisonResult)compare:(SearchResult *)otherResult{
  return [self.name compare:otherResult.name];
}

3 回目の試行:

    sortedResults = (NSMutableArray *)[searchResults sortedArrayUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)]]];

4回目はブロックを使ってみました。並べ替えを操作するコードを入れてみましたが、うまくいきませんでした。返された配列は元のものとまったく同じでした:

sortedArray = [searchResults sortedArrayUsingComparator:^NSComparisonResult(id a, id b) {
    if ([(SearchResult *)a itemId] < 20000 )
        return NSOrderedAscending;
    else
        return NSOrderedDescending;
}];

誰にもアイデアはありますか?

4

1 に答える 1

0

問題が見つかりました-各オブジェクトを配列に追加するのではなく、配列をオブジェクトとして追加していました。これは、カスタム オブジェクトではなく、NSArray で並べ替えを呼び出していました。上記のコードを から[searchResults addObject:documents];に変更すると[searchResults addObjectsFromArray:documents];、問題が解決しました!

于 2013-02-25T16:41:25.763 に答える