您的位置:首页 > 其它

AddressBook获取用户信息

2016-07-02 20:48 381 查看
- (void)viewDidLoad {
[super viewDidLoad];

_table.delegate = self;
_table.dataSource = self;
_array = [[NSMutableArray alloc] init];
_resultArray = [[NSMutableArray alloc] init];

__block ABAddressBookRef addressBook;
//请求通讯录使用权限
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {
if (!granted) {
NSLog(@"权限已关闭,请去设置中打开权限");
}
//获取通讯录
addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

//把通讯里中所有的联系人复制到一个数组中。
NSArray *peopleArray =  (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);

//NSLog(@"%lu",peopleArray.count);
for (int i = 0; i<peopleArray.count; i++) {
ABRecordRef person = [peopleArray objectAtIndex:i];
People *p = [[People alloc] init];
p.name = (NSString *)ABRecordCopyCompositeName(person);

ABMultiValueRef ref = ABRecordCopyValue(person, kABPersonPhoneProperty);

p.phone = ABMultiValueCopyValueAtIndex(ref, 0);
[_array addObject:p];
[p release];
}
//权限的请求是异步执行的,所以数据会在tableView出现之后读取完毕,需要刷新tableView才能显示。
//[_table reloadData];

//performSelectorOnMainThread在主线程中调用方法
//waitUntilDone,YES就是同步,NO就是异步。
[_table performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
});

_searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 375, 40)];
_searchBar.barStyle = UIBarStyleDefault;
//设置搜索范围的button数量和标题
_searchBar.scopeButtonTitles = @[@"按照姓名搜索",@"按照电话搜索"];
//_searchBar.tintColor = [UIColor greenColor];
_searchBar.barTintColor = [UIColor purpleColor];
[_searchBar setImage:[UIImage imageNamed:@"123.png"] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];

_display = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self];
//设置搜索代理
_display.delegate = self;
//设置结果表的代理
_display.searchResultsDelegate = self;
//设置结果表的数据源
_display.searchResultsDataSource = self;
//tableHeaderView,表头,一个表只有一个表头。在tableView的最顶端。
_table.tableHeaderView = _searchBar;

}
//当搜索栏中的文本发生编辑时调用,返回YES刷新结果表,返回NO不刷新结果表
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
//每次搜索前,先清空上次的搜索结果
[_resultArray removeAllObjects];

if (_searchBar.selectedScopeButtonIndex == 0) {
//按照姓名搜索
for (People *p in _array) {
//hasPrefix判断一个字符串是否以另一个字符串开头。
//uppercaseString把字符串中所有字母转成大写。
if ([[p.name uppercaseString] hasPrefix:[searchString uppercaseString]]) {
[_resultArray addObject:p];
}
}
}else{
//按照电话搜索
for (People *p in _array) {
if ([p.phone hasPrefix:searchString]) {
[_resultArray addObject:p];
}
}
}
return YES;
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption{
[self searchDisplayController:controller shouldReloadTableForSearchString:_searchBar.text];
return YES;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (tableView == _table) {
return _array.count;
}else{
//结果表
return _resultArray.count;
}
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (!cell) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"] autorelease];
}
People *p = [tableView == _table?_array:_resultArray objectAtIndex:indexPath.row];
cell.textLabel.text = p.name;
cell.detailTextLabel.text = p.phone;
return cell;
}

注意如下:

1、在info.plist文件中添加访问权限,Privacy - Contacts Usage Description

2、
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) 获取授权,否则在设置中都无法看到授权,这样只有第一次调用iOS才会弹出允许的提示窗口,所以如果第一次被拒绝了,则需要去“设置->隐私->通讯录”中打开


3、权限的请求是异步执行的,获得完数据之后需要在主线程中刷新table,dispatch_async(dispatch_get_main_queue(), ^{});


效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: