Objective c 如何实现与AddressBook相同的排序功能?
在我的应用程序中,我有按升序显示的联系人列表。当用户单击任何字母表(如“b”)时,列表应滚动到从“b”开始的联系人。这是地址簿的内置功能吗?有人知道我如何实现这一点吗Objective c 如何实现与AddressBook相同的排序功能?,objective-c,addressbook,Objective C,Addressbook,在我的应用程序中,我有按升序显示的联系人列表。当用户单击任何字母表(如“b”)时,列表应滚动到从“b”开始的联系人。这是地址簿的内置功能吗?有人知道我如何实现这一点吗 提前谢谢 我的方法很肮脏。它通过电子邮件排序,名字和姓氏省略中间名,因为我不需要那个名字。哦,它只找到那些有电子邮件地址的联系人。如果您稍微编辑以if(ABMultiValueGetCount(emailRef)) 您的视图控制器: - (NSArray *)sortedContactsFromPeople:(CFArra
提前谢谢 我的方法很肮脏。它通过电子邮件排序,名字和姓氏省略中间名,因为我不需要那个名字。哦,它只找到那些有电子邮件地址的联系人。如果您稍微编辑以
if(ABMultiValueGetCount(emailRef))
您的视图控制器:
- (NSArray *)sortedContactsFromPeople:(CFArrayRef)people {
NSMutableArray *contacts = [NSMutableArray array];
for (int i = 0; i < CFArrayGetCount(people); i++) {
ABRecordRef record = CFArrayGetValueAtIndex(people, i);
ABMultiValueRef emailRef = ABRecordCopyValue(record, kABPersonEmailProperty);
CFStringRef email;
if (ABMultiValueGetCount(emailRef)) {
BOOL hasValidEmail = NO;
for (int j = 0; j < ABMultiValueGetCount(emailRef); j++) {
if (!hasValidEmail) {
email = ABMultiValueCopyValueAtIndex(emailRef, j);
if ([Validator validateEmail:(NSString *)email] == kValNoErr)
hasValidEmail = YES;
else
CFRelease(email);
}
}
if (hasValidEmail) {
CFStringRef name = ABRecordCopyValue(record, kABPersonFirstNameProperty);
CFStringRef lastname = ABRecordCopyValue(record, kABPersonLastNameProperty);
NSData *contactImageData = (NSData*)ABPersonCopyImageData(record);
UIImage *img = [[[UIImage alloc] initWithData:contactImageData] autorelease];
[contactImageData release];
if (lastname == nil)
lastname = (CFStringRef)@"";
if (name == nil)
name = (CFStringRef)@"";
Contact *contact = [[[Contact alloc] initWithName:(NSString *)name
lastname:(NSString *)lastname
email:(NSString *)email
profileIcon:img] autorelease];
if (![(NSString *)lastname isEqualToString:@""])
contact.sortChar = [(NSString *)lastname substringToIndex:1];
else if (![(NSString *)name isEqualToString:@""])
contact.sortChar = [(NSString *)name substringToIndex:1];
else if (![(NSString *)email isEqualToString:@""])
contact.sortChar = [(NSString *)email substringToIndex:1];
contact.idNumber = ABRecordGetRecordID(record);
[contacts addObject:contact];
if (lastname)
CFRelease(lastname);
if (name)
CFRelease(name);
CFRelease(email);
}
}
CFRelease(emailRef);
}
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"sortChar" ascending:YES selector:@selector(caseInsensitiveCompare:)];
[contacts sortUsingDescriptors:[NSArray arrayWithObject:descriptor]];
return contacts;
}
- (void)initBaseValues {
sections = [[NSMutableDictionary alloc] init];
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef people = ABAddressBookCopyArrayOfAllPeople(addressBook);
NSInteger section = 0;
NSString *prevChar = nil;
NSArray *contacts = [self sortedContactsFromPeople:people];
for (int i = 0; i < contacts.count; i++) {
Contact *contact = [contacts objectAtIndex:i];
BOOL sectionExists = NO;
if ([prevChar isEqualToString:contact.sortChar])
sectionExists = YES;
if (!sectionExists) {
[sections setObject:[NSMutableArray array] forKey:[NSString stringWithFormat:@"%d", section]];
section++;
}
[prevChar autorelease];
prevChar = [contact.sortChar copy];
[[sections objectForKey:[NSString stringWithFormat:@"%d", section-1]] addObject:contact];
}
if (prevChar != nil)
[prevChar release];
CFRelease(people);
CFRelease(addressBook);
}
啊!我不够警惕,没有仔细阅读整件事尝试创建NSMutableDictionary,每次调用headerForSection:方法时,将其偏移量以适当的字母作为键存储在字典中。然后,当用户选择“B”字母时,发送您的UITableView setContentOffset:animated:方法,并从该字典中获取适当的偏移量。这不是排序功能……据我所知,没有一种方法可以不越狱。但是-看起来自己实现起来也不是那么难,这绝对是可行的。嘿,谢谢你的回复,但是从联系人我指的是客户列表。我有一个包含客户名称的数组,我正在使用SimpleUITableView显示它。上面的代码仍然可以对您可能需要的任何类型的联系人进行排序。请注意,您可以删除使用ABAddressBook的所有代码并实现相同的目标。对于表视图,在“numberOfSectionsInTableView:”中返回“sections”字典计数,并返回“[sections objectForKey:[NSString stringWithFormat:@“%d”,indexath.row]”;”在“numberOfRowsInSection:”中。
@interface Contact : NSObject {
NSString *name;
NSString *lastname;
NSString *email;
UIImage *profileIcon;
NSInteger idNumber;
}
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *lastname;
@property (nonatomic, copy) NSString *email;
@property (nonatomic, retain) UIImage *profileIcon;
@property (nonatomic) NSInteger idNumber;
@property (nonatomic, copy) NSString *sortChar;
- (id)initWithName:(NSString *)name_
lastname:(NSString *)lastname_
email:(NSString *)email_
profileIcon:(UIImage *)profileIcon_;
@end