2014-07-10 16 views
14

Ho bisogno di convertire il valore di ritorno di questa funzione dal quadro AddressBook:Swift (iOS 8 SDK) Convertire gestito <ABMultiValueRef> per ABMultiValueRef

ABRecordCopyValue(nil, kABPersonPhoneProperty) 

ad un valore di tipo ABMultiValueRef

Questa funzione è attualmente contrassegnato come questo:

func ABRecordCopyValue(record: ABRecordRef!, property: ABPropertyID) -> Unmanaged<AnyObject>! 

così posso convertirlo in non gestito in questo modo:

ABRecordCopyValue(person, kABPersonPhoneProperty) as Unmanaged<ABMultiValueRef> 

Ma come posso ottenerlo come ABMultiValueRef in modo che possa passarlo a questa funzione?

func ABMultiValueGetIndexForIdentifier(multiValue: ABMultiValueRef!, identifier: ABMultiValueIdentifier) -> CFIndex 

ho fatto questo:

let managedPhones = Unmanaged.fromOpaque(phones.toOpaque()).takeUnretainedValue() as ABMultiValueRef 

E continuo a ricevere questo errore di compilazione:

Bitcast requires both operands to be pointer or neither 
%89 = bitcast %objc_object* %88 to %PSs9AnyObject_, !dbg !325 
LLVM ERROR: Broken function found, compilation aborted! 
Command /Applications/Xcode6-Beta3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 1 
+0

Ho lo stesso errore. Sono bloccato con il recupero dei record del libro ordinati :( – Anton

+0

Ho sentito che questo è perché Apple non ha ancora (come iOS 8 SDK Beta 4) abilitato CF_IMPLICIT_BRIDGING_ENABLED sul framework AddressBook. –

+0

Ok, ora capisco :( – Anton

risposta

24

ho trovato la soluzione:

func peoplePickerNavigationController(
    peoplePicker: ABPeoplePickerNavigationController!, 
    didSelectPerson person: ABRecordRef!) { 

    /* Do we know which picker this is? */ 
    if peoplePicker != personPicker{ 
     return 
    } 

    /* Get all the phone numbers this user has */ 
    let unmanagedPhones = ABRecordCopyValue(person, kABPersonPhoneProperty) 
    let phones: ABMultiValueRef = 
    Unmanaged.fromOpaque(unmanagedPhones.toOpaque()).takeUnretainedValue() 
     as NSObject as ABMultiValueRef 

    let countOfPhones = ABMultiValueGetCount(phones) 

    for index in 0..<countOfPhones{ 
     let unmanagedPhone = ABMultiValueCopyValueAtIndex(phones, index) 
     let phone: String = Unmanaged.fromOpaque(
     unmanagedPhone.toOpaque()).takeUnretainedValue() as NSObject as String 

     println(phone) 
    } 
} 
+0

Works, grazie mille! – Aaron

+0

Prego, mi ha aiutato. –

+2

Piuttosto che il 'fromOpaque'/'toOpaque' dance, perché non basta fare' lascia telefoni: ABMultiValueRef = unmanagedPhones.takeUnretainedValue() 'e' lascia phone = unmanagedPhone.takeUnretainedValue() come String'? – Rob

1

Nel caso in cui qualcuno è alla ricerca di un modo finale per affrontare ABRecords a Swift 2, eccolo:

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController, didSelectPerson person: ABRecord) { 

    let firstName = ABRecordCopyValue(person, kABPersonFirstNameProperty).takeRetainedValue() 
    let lastName = ABRecordCopyValue(person, kABPersonLastNameProperty).takeRetainedValue() 

    var emails:[String] = [] 
    let emailRecords = ABRecordCopyValue(person, kABPersonEmailProperty).takeRetainedValue() as ABMultiValueRef 
    let emailsCount = ABMultiValueGetCount(emailRecords) 
    for index in 0 ..< emailsCount { 
     if let email = ABMultiValueCopyValueAtIndex(emailRecords, index).takeRetainedValue() as? String { 
      emails.append(email) 
     } 
    } 

    print("Contact selected. firstName: \(firstName), lastName: \(lastName), emails: \(emails)") 

} 
+0

Una vita simile r! –