2

連絡先情報の配列の並べ替えを行っています。特定の連絡先の名と姓を入力すると正常に機能しますが、いずれかが欠落している場合は正常に機能しません。

例: John という名前と mickey という名前を入力すると、適切な並べ替えが行われますが、mickey のみを入力すると、最終的に UITableview の # セクションに表示されます。 .

私のコードは以下の通りです、

NSSortDescriptor *sortDescriptorFirstName = [[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES selector:@selector(localizedStandardCompare:)] autorelease];

NSSortDescriptor *sortDescriptorLastName = [[[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES selector:@selector(localizedStandardCompare:)] autorelease];

NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptorFirstName,sortDescriptorLastName,nil];

if(favFlag){
    favContacts = [[contactsData sortedArrayUsingDescriptors:sortDescriptors] mutableCopy];
    [self setListContent:favContacts];
}
else {
    contacts = [[contactsData sortedArrayUsingDescriptors:sortDescriptors] mutableCopy];
    [self setListContent:contacts];
}

[contactTableView reloadData];
4

1 に答える 1

1

カスタム基準がある場合は、記述子の代わりにコンパレータ ブロックを使用できます。たとえば、次を使用できますsortedArrayUsingComparator

contacts = [contactsData sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    NSString *sortName1 = [self sortNameWithFirst:[obj1 objectForKey:@"firstName"]
                                             last:[obj1 objectForKey:@"lastName"]];

    NSString *sortName2 = [self sortNameWithFirst:[obj2 objectForKey:@"firstName"]
                                             last:[obj2 objectForKey:@"lastName"]];

    return [sortName1 caseInsensitiveCompare:sortName2];
}];

「ソート名」を簡単に作成できるようにするためのこの小さなユーティリティ メソッドがあります。これは、最終的にソートする文字列を表す用語です。

- (NSString *)sortNameWithFirst:(NSString *)firstName last:(NSString *)lastName
{
    if (firstName && lastName)
        return [NSString stringWithFormat:@"%@ %@", firstName, lastName];
    if (firstName)
        return firstName;
    if (lastName)
        return lastName;
    return nil;
}

このコードは、次のリストを受け取ります。

NSArray *contactsData = @[
    @{@"firstName":@"Rob", @"lastName":@"Zimmer"},
    @{@"firstName":@"Sting"},
    @{@"firstName":@"Rob", @"lastName":@"Ryan"},
    @{@"firstName":@"Cher"},
    @{@"lastName":@"Smith"}
];

そして、「シェール」、「ロブ・ライアン」、「ロブ・ジマー」、「スミス」、「スティング」を教えてくれます。

正直なところ、あなたの質問に基づいてどのように並べ替えたいのか完全にはわかりませんでしたが、アイデアはわかります。のコンパレータ ブロックsortedArrayUsingComparatorを使用すると、任意のカスタム ソート基準を作成できます。、、または(私が生成するために便利に使用している)NSComparisonResultのいずれかの値を返す必要があるだけです。代替検索のリストについては、 NSArray クラス リファレンスにリストされている並べ替えメソッドを参照してください。NSOrderedAscendingNSOrderedSameNSOrderedDescendingcaseInsensitiveCompare

于 2012-12-14T07:09:12.130 に答える