将iOS通讯录存储在数组中,并在UITableView中显示



我想将iOS的通讯录存储在数组中,并将其显示在UITableView中。这是我正在使用的代码。我只想显示联系人姓名和电话号码。

pragma标记地址簿方法

 (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    
    ABPeoplePickerNavigationController *picker= [[ABPeoplePickerNavigationController alloc] init];
    
    picker.peoplePickerDelegate = self;
    
    [self presentModalViewController:picker animated:YES];
    
    
    return NO;
}
 (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person{
    ABMultiValueRef phone = (ABMultiValueRef) ABRecordCopyValue(person, kABPersonPhoneProperty);
    ABMultiValueRef personID = (ABMultiValueRef) ABRecordCopyValue(person, kABPersonFirstNameProperty);
    
    CFStringRef phoneID = ABMultiValueCopyValueAtIndex(phone, 0);
     //CFStringRef personName= ABMultiValueCopyValueAtIndex(personID, 0);
    NSLog(@"%@",[NSString stringWithFormat:@"%@", phoneID]);
    NSLog(@"%@",[NSString stringWithFormat:@"%@", personID]);
    
}

请参阅Rays通讯录教程。我认为它应该回答你所有的问题。

为什么在文本开头调用选择器导航器?您应该通过添加为右栏按钮项的按钮来调用它。然后选择所需的人员并将其存储在可变数组中。之后,关闭控制器并加载表视图。

编辑:请找到下面的代码供您参考。我希望它能帮助我们理解它是如何运作的。这也是示例代码的参考链接。

接口:

#import <UIKit/UIKit.h>
@interface JSViewController : UITableViewController
@end

实施:

#import "JSViewController.h"
#import <AddressBookUI/AddressBookUI.h>
#import <AddressBook/AddressBook.h>
@interface JSViewController ()<ABPeoplePickerNavigationControllerDelegate,UITableViewDataSource,UITableViewDelegate>
@property (nonatomic, strong) NSMutableArray *peopleSelected;
@end
@implementation JSViewController
-(NSMutableArray *)peopleSelected
{
    if (!_peopleSelected) {
        _peopleSelected = [NSMutableArray new];
}
return _peopleSelected;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIBarButtonItem *selectPerson = [[UIBarButtonItem alloc] initWithTitle:@"Select" style:UIBarButtonItemStyleBordered target:self action:@selector(btnSelectHandler:)];
    self.navigationItem.rightBarButtonItem = selectPerson;

}
- (void)btnSelectHandler:(id)sender
{
    ABPeoplePickerNavigationController *peoplePicker = [ABPeoplePickerNavigationController new];
    peoplePicker.peoplePickerDelegate = self;
    [self.navigationController presentViewController:peoplePicker animated:YES completion:^{
    }];
}
#pragma mark - ABPeoplePickerNavigationControllerDelegate
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker;
{
    [self dismissViewControllerAnimated:YES completion:^{
        if (self.peopleSelected) {
            [self.tableView reloadData];
        }
    }];
}

以下方法在iOS 8.0中已弃用。您可以使用功能

- peoplePickerNavigationController:didSelectPerson:

而不是这个:

//Deprecated in iOS 8.0.
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
    NSString *name =  (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));
    ABMultiValueRef phoneNumbers = (ABRecordCopyValue(person, kABPersonPhoneProperty));
    NSString *mobile = @"";
    NSString *label = @"";
    for (CFIndex i=0 ; i<ABMultiValueGetCount(phoneNumbers); i++) {
        label = (__bridge NSString *)ABMultiValueCopyLabelAtIndex(phoneNumbers, i);
        if ([label isEqualToString:(NSString *)kABPersonPhoneMobileLabel]) {
            mobile = (__bridge NSString *)ABMultiValueCopyValueAtIndex(phoneNumbers, i);
        }else if([label isEqualToString:(NSString*)kABPersonPhoneIPhoneLabel]){
            mobile = (__bridge NSString *)ABMultiValueCopyValueAtIndex(phoneNumbers, i);
            break;
        }
    }
    NSDictionary *dict = @{@"name":name,
                           @"phone":mobile};
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.phone == %@ && self.name == %@",mobile,name];
    NSArray *personAlready = [self.peopleSelected filteredArrayUsingPredicate:predicate];
    NSLog(@"personAlready %@",personAlready);
    if (!personAlready.count) {
        [self.peopleSelected addObject:dict];
    }
    return NO;
}
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
    return YES;
}
#pragma mark - UITableViewDataSource
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.peopleSelected.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    NSDictionary *dict = self.peopleSelected[indexPath.row];
    cell.textLabel.text = dict[@"name"];
    return cell;
}
#pragma mark - UITableViewDelegate
@end

最新更新