0

誰かが私が直面している問題を手伝ってくれるかどうか疑問に思っていました. 標準的な方法で電話連絡先を取得しました (lastName で並べ替える必要があります)。

NSMutableArray *contactArray = [NSMutableArray array]; 
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook); 
CFMutableArrayRef peopleMutable = CFArrayCreateMutableCopy(kCFAllocatorDefault,CFArrayGetCount(people), people);

CFArraySortValues(peopleMutable, CFRangeMake(0,
CFArrayGetCount(peopleMutable)),
(CFComparatorFunction)ABPersonComparePeopleByName, (void
*)kABPersonSortByLastName);

NSArray *allPeopleArray = (NSArray *)peopleMutable;

各レコードをループし、NSMutableDictionary に kABPersonFirstNameProperty、kABPersonLastNameProperty、kABPersonEmailProperty、kABPersonPhoneProperty を入力します。一部の連絡先には、firstName または lastName がありません。したがって、私はそれらをチェックし、MutableDictionary に [NSNull null] を入れて、firstName または lastName のいずれかを指定します。次に、この MutableArray を並べ替える必要があります。NSSortDescriptor を使用して並べ替えます

NSSortDescriptor *aSortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES];
NSSortDescriptor *aSortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES]; 
[listToSort sortUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor1, aSortDescriptor2, nil]];
[aSortDescriptor1 release]; 
[aSortDescriptor2 release]; 

NSLog listToSort を実行すると、リストは正しくソートされます。

次に、この並べ替えられた可変配列をこのメソッドに渡します。このメソッドは基本的に、UItableview に表示するための sectionList を作成します

-(void)setupSectionList:(NSMutableArray *)contactList {
sectionNames = [[NSMutableArray alloc]init];
sectionData = [[NSMutableArray alloc]init];
NSString *previous=@"";
for (NSDictionary *dict in contactList) {
    NSString *lastName = [dict objectForKey:@"lastName"];
    NSString *firstName = [dict objectForKey:@"firstName"];

    NSString *firstLetter = nil;
    if ([dict objectForKey:@"lastName"] != [NSNull null]) {
        firstLetter = [lastName substringToIndex:1];
    }else if ([dict objectForKey:@"firstName"] != [NSNull null]) {
        firstLetter = [firstName substringToIndex:1];
    }
    //Get the first Letter

    if (firstLetter) {
        //Add the letter to sectioNames when it is different
        if (![firstLetter isEqualToString:previous]) {
            previous = firstLetter;
            [sectionNames addObject:[firstLetter uppercaseString]];
            //Now add a new array to our array of arrays
            NSMutableArray *oneSection = [NSMutableArray array];
            [sectionData addObject:oneSection];
        }
        //Add this dictionary to the last section array
        [[sectionData lastObject] addObject:dict];
    }
}
}

ここでソートがめちゃくちゃになります。ここに例があります。FirstName だけが FirstName で、他には何もない連絡先があります。他に、John Appleseed と William Frank という 2 人の連絡先があります。上記のコードから sectionData を NSLog すると、最初の文字が F、A、F と表示されます。A、F が表示されることを望んでいました。事前にご協力いただきありがとうございます。

4

1 に答える 1

1

このチェックの代わりに:

if (![firstLetter isEqualToString:previous])

これを試して:

if ([sectionNames indexOfObject:firstLetter] == NSNotFound)

この最初の文字を既に持っているかどうかを判断するため。

于 2013-03-09T08:43:11.123 に答える