ABAddressBook을 사용하는 사람들의 이름과 이메일에 액세스 할 수있는 몇 가지 기능이 있습니다. 이 기능은 이름과 전자 메일을 connections
배열에 추가합니다. 내가 직면 한 문제는 사용자가 처음으로 주소록에 액세스하라는 메시지를 표시하고 예를 누를 때 배열이로드되지만 테이블 뷰가 업데이트되지 않는다는 것입니다.ABAddressBook (Swift)에서 배열로 UITableView로드하기
두 번째로 앱이로드되고 (이미 '예'로 설정 되었기 때문에 질문을받지 않는 경우) 배열이로드되고 tableview가 업데이트됩니다.
왜 이런지 알 수 없습니다. 나는 그것이 두 번째 시도에서 작동하기 때문에 reloadData()
과 관련이 있다고 생각하지 않습니다.
제 생각에는 코드의 논리에 대해 잘못된 것이 있습니다 만, 알아낼 수 없습니다.
코드 :
func getAddressBookNames() {
let authorizationStatus = ABAddressBookGetAuthorizationStatus()
if (authorizationStatus == ABAuthorizationStatus.NotDetermined) {
var emptyDictionary: CFDictionaryRef?
var addressBook = !(ABAddressBookCreateWithOptions(emptyDictionary, nil) != nil)
ABAddressBookRequestAccessWithCompletion(addressBook,{success, error in
if success {
self.processContactNames();
}
else {
println("Unable to request access")
}
})
} else if (authorizationStatus == ABAuthorizationStatus.Denied || authorizationStatus == ABAuthorizationStatus.Restricted) {
println("access denied")
} else if (authorizationStatus == ABAuthorizationStatus.Authorized) {
println("access granted")
processContactNames()
}
}
func processContactNames()
{
var errorRef: Unmanaged<CFError>?
var addressBook: ABAddressBookRef? = extractABAddressBookRef(ABAddressBookCreateWithOptions(nil, &errorRef))
println(addressBook)
var contactList: NSArray = ABAddressBookCopyArrayOfAllPeople(addressBook).takeRetainedValue()
println("records in the array \(contactList.count)")
for record:ABRecordRef in contactList {
processAddressbookRecord(record)
}
}
func processAddressbookRecord(addressBookRecord: ABRecordRef) {
var contactName: String = ABRecordCopyCompositeName(addressBookRecord).takeRetainedValue() as NSString
connections.append("\(contactName) is an aquaintance")
connectionDetails.append("Learned from Contacts")
connectionCounter.text = "\(connections.count) Connections"
processEmail(addressBookRecord, contactNameForEmail: contactName)
}
func processEmail(addressBookRecord: ABRecordRef, contactNameForEmail: String) {
let emailArray:ABMultiValueRef = extractABEmailRef(ABRecordCopyValue(addressBookRecord, kABPersonEmailProperty))!
for (var j = 0; j < ABMultiValueGetCount(emailArray); ++j) {
var emailAdd = ABMultiValueCopyValueAtIndex(emailArray, j)
var emailString = extractABEmailAddress(emailAdd)
connections.append("\(contactNameForEmail)'s email is \(emailString!)")
connectionDetails.append("Learned from Contacts")
connectionCounter.text = "\(connections.count) Connections"
}
}
func extractABAddressBookRef(abRef: Unmanaged<ABAddressBookRef>!) -> ABAddressBookRef? {
if let ab = abRef {
return Unmanaged<NSObject>.fromOpaque(ab.toOpaque()).takeUnretainedValue()
}
return nil
}
func extractABEmailRef (abEmailRef: Unmanaged<ABMultiValueRef>!) -> ABMultiValueRef? {
if let ab = abEmailRef {
return Unmanaged<NSObject>.fromOpaque(ab.toOpaque()).takeUnretainedValue()
}
return nil
}
func extractABEmailAddress (abEmailAddress: Unmanaged<AnyObject>!) -> String? {
if let ab = abEmailAddress {
return Unmanaged.fromOpaque(abEmailAddress.toOpaque()).takeUnretainedValue() as CFStringRef
}
return nil
}
내가 생각할 수있는 모든 가능한 포인트 이후에 reloadData()를 호출 해 보았습니다! 난 그냥 '성공 processContactNames()'후 다시 호출 해 보았습니다. 아직도 작동하지 않았다. 내가 어디에서 불러야한다고 생각하니? –
죄송합니다. 스레드 문제가 있습니다. 내 대답을 업데이트 할게. – matt
완벽! 고마워요. –