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(), ^{});
效果如下:
相关文章推荐
- 最短路经典例题 codevs 1557 热浪
- 基于Java实现简单Http服务器
- UVa1374(快速幂)
- mysql 更具父类id 查询所有子类id
- flush tables with read lock 失效
- Category的进阶问题
- 开发常用
- android中jsoup解析html的几个例子
- PAT - 甲级 - 1007. Maximum Subsequence Sum (25)
- Matlab资料收纳
- 创建内外部文件
- linux及windows文件共享
- ++i 和 i++ 性能上的区别
- matlab_多项式
- 【华为OJ】查找兄弟单词
- 机器学习资料
- 训练4 习题6
- 文章标题
- sd-slam源码解读第六篇:GlobalMapping
- 畅通工程