Reputation: 43
I want to have my user select a phone number for someone in their contacts and I want to return that number to the app so that I can use it for later. Here is my code for allowing the user to select one of their contacts phone numbers, but when I click a phone number it calls that number (which I don't want to happen) and doesn't return anything to my app.
class ViewController: UIViewController {
var people = ABPeoplePickerNavigationController()
var addressBook: ABAddressBookRef?
func extractABAddressBookRef(abRef: Unmanaged<ABAddressBookRef>!) -> ABAddressBookRef? {
if let ab = abRef {
self.view.addSubview(people.view)
return Unmanaged<NSObject>.fromOpaque(ab.toOpaque()).takeUnretainedValue()
}
return nil
}
func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecordRef!, property: ABPropertyID, identifier: ABMultiValueIdentifier) {
let multiValue: ABMultiValueRef = ABRecordCopyValue(person, property).takeRetainedValue()
let index = ABMultiValueGetIndexForIdentifier(multiValue, identifier)
let phoneNumber = ABMultiValueCopyValueAtIndex(multiValue, index).takeRetainedValue() as! String
println(phoneNumber)
}
Upvotes: 0
Views: 700
Reputation: 103
I have implemented a solution that only show contacts that have phone numbers, and the user has to select a concrete phone number. Your ViewController has to implement ABPeoplePickerNavigationControllerDelegate
protocol.
Here is my code:
func checkAuthorization ()
{
switch (ABAddressBookGetAuthorizationStatus())
{
case .NotDetermined:
ABAddressBookRequestAccessWithCompletion(ABAddressBookCreateWithOptions(nil, nil).takeRetainedValue(),
{ (granted: Bool, error: CFError!) -> Void in
if (granted)
{
// Access granted, show picker
self.showPeoplePicker();
}
else
{
// Custom func to show an alert
self.showAlertForContactPermission();
}
})
break;
case .Restricted, .Denied:
// Custom func to show an alert
showAlertForContactPermission();
break;
case .Authorized:
// Access granted, show picker
showPeoplePicker();
break;
}
}
func showPeoplePicker ()
{
// Create picker
let peoplePicker: ABPeoplePickerNavigationController = ABPeoplePickerNavigationController();
peoplePicker.peoplePickerDelegate = self;
// Show only contacts that have phone number
peoplePicker.displayedProperties = [NSNumber(int: kABPersonPhoneProperty)];
peoplePicker.predicateForEnablingPerson = NSPredicate(format: "phoneNumbers.@count > 0", argumentArray: nil);
// User has to select explicity phone number
peoplePicker.predicateForSelectionOfProperty = NSPredicate(format: "key == 'phoneNumbers'", argumentArray: nil);
// Present picker
presentViewController(peoplePicker, animated: true, completion: nil);
}
func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController, didSelectPerson person: ABRecord, property: ABPropertyID, identifier: ABMultiValueIdentifier)
{
// Get name
let name: String = ABRecordCopyCompositeName(person).takeRetainedValue() as String;
// Get phone number selected
let multiValuePhones: ABMultiValueRef = ABRecordCopyValue(person, property).takeRetainedValue();
let selectedIndex: CFIndex = ABMultiValueGetIndexForIdentifier(multiValuePhones, identifier);
let selectedPhone: String = ABMultiValueCopyValueAtIndex(multiValuePhones, selectedIndex).takeRetainedValue() as! String;
// Get only digits
let digitsArray: [String] = selectedPhone.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet);
let phoneDigits: String = digitsArray.joinWithSeparator("");
// Pass info to your func
saveNewEmployee(name, phoneNumber: phoneDigits);
}
Upvotes: 1