我想让我的用户为联系人中的某人选择一个电话号码,然后将该号码返回给应用程序,以便以后使用。这是我的代码,允许用户选择其联系人的电话号码之一,但是当我单击一个电话号码时,它将呼叫该号码(我不想发生),并且不会向我的应用返回任何内容。
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)
}
最佳答案
我已经实现了一个解决方案,该解决方案仅显示具有电话号码的联系人,并且用户必须选择一个具体的电话号码。您的ViewController必须实现ABPeoplePickerNavigationControllerDelegate
协议。
这是我的代码:
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);
}