在我的應用程序中,我列出了按升序顯示的聯繫人。當用戶單擊任何字母表時,都會顯示'b',那麼列表應該滾動到從'b'開始的聯繫人。這是AddressBook的內置功能?有誰知道我可以如何實現這一目標?如何實現與AddressBook相同的排序功能?
在此先感謝!
在我的應用程序中,我列出了按升序顯示的聯繫人。當用戶單擊任何字母表時,都會顯示'b',那麼列表應該滾動到從'b'開始的聯繫人。這是AddressBook的內置功能?有誰知道我可以如何實現這一目標?如何實現與AddressBook相同的排序功能?
在此先感謝!
我很骯髒的方法。它通過電子郵件排序,名字和姓氏省略中間名,因爲我不需要那個。哦,它只找到那些有電子郵件地址的聯繫人。你能避免,如果你稍微修改代碼開頭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);
}
Contact.h
@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
衛生署!我沒有足夠的警惕,仔細閱讀整件事情。 :)嘗試創建NSMutableDictionary,並且每次調用headerForSection:方法時,都會將它的偏移量存儲在字典中,並使用適當的字母作爲鍵。然後,當用戶選擇「B」字母發送你的UITableView setContentOffset:animated:方法與從該字典取得適當的偏移量。
嘿謝謝你的回覆,但來自聯繫人我的意思是客戶名單。我有一個數組,其中包含客戶名稱,我使用簡單的UITableView顯示。 –
那麼上面的代碼仍然可以排序你可能需要的任何類型的聯繫人。看到你可以刪除所有使用ABAddressBook的代碼並實現相同的目標。對於表視圖,返回'numberOfSectionsInTableView:'中的「sections」字典計數並返回'[sections objectForKey:[NSString stringWithFormat:@「%d」,indexPath.row]];'在'numberOfRowsInSection:'中。 – Eugene
這不是一種排序功能...... – Saphrosit
據我所知,沒有越獄的方法。但是 - 看起來實際上並不是很難實現自己,這絕對是可行的。 –