【发布时间】:2014-08-25 01:01:29
【问题描述】:
我正在尝试使用 ABRecordSetValue() 更新 Swift 中的各种联系人属性,但是下次我打开模拟器时,它不会显示 ABPeoplePickerNavigation.presentViewController() 中的更改:
- 点击按钮打开联系人选择器
- 选择联系人
- 点击按钮再次打开联系人选择器
预期: 模拟器中的联系人具有我分配的新名字
实际: Println 显示该值似乎已被分配,但在视图中,名称并没有改变
我假设 ABAddressBookSave() 会提交更改,所以我想知道是否需要提交其他内容,或者我可能需要以某种方式更新用于人员选取器视图控制器的 addressBook 引用以反映更改?
首先视图会提示请求访问联系人,然后为 var adbk 赋值:
var adbk : ABAddressBook!
var authDone = false
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
if !self.authDone {
self.authDone = true
let stat = ABAddressBookGetAuthorizationStatus()
switch stat {
case .Denied, .Restricted:
println("no access")
case .Authorized, .NotDetermined:
var err : Unmanaged<CFError>? = nil
var adbk : ABAddressBook? = ABAddressBookCreateWithOptions(nil, &err).takeRetainedValue()
if adbk == nil {
println(err)
return
}
ABAddressBookRequestAccessWithCompletion(adbk) {
(granted:Bool, err:CFError!) in
if granted {
self.adbk = adbk
} else {
println(err)
}//if
}//ABAddressBookReqeustAccessWithCompletion
}//case
}//if
}//viewDidAppear
然后绑定到 showPicker 的按钮显示人员选择器 UI:
var person: ABRecord!
@IBAction func showPicker(sender: AnyObject) {
var picker: ABPeoplePickerNavigationController = ABPeoplePickerNavigationController()
picker.peoplePickerDelegate = self
self.presentViewController(picker, animated: true, completion:nil)
}//showPicker
选择联系人后,我会尝试更新该 ABRecordRef! "person" 使用 ABRecordSetValue,它返回 true,并且 firstName 道具的值显示新值,所以我不确定出了什么问题:
func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecordRef!) -> Bool {
self.person = person
println(ABRecordCopyValue(person, kABPersonFirstNameProperty).takeUnretainedValue())
var updateSucceeded = ABRecordSetValue(person, kABPersonFirstNameProperty, "New First Name", nil)
println("Did the update succeed? \(updateSucceeded)")
println(ABRecordCopyValue(person, kABPersonFirstNameProperty).takeUnretainedValue())
ABAddressBookSave(adbk, nil)
println(ABRecordCopyValue(person, kABPersonFirstNameProperty).takeUnretainedValue())
}//navController
(缺乏)进度更新: 在 Apple 发誓后,我终于在我的 iPhone 5 上构建了工作(必须将 didSelectPerson 更改为 shouldContinueAfterSelectingProgram,因为前者仅适用于 iOS8,后者是 iOS 7,在 iOS8 中已弃用)
结果与 sim 稍有不同 - 虽然 ABRecordSetValue 和 ABAddressBookSave 都表示成功,但在手机中,保存后的 ABRecordCopyValue 返回旧的、未更改的名称。在 sim 中,它返回更改后的名称,但 UI 不反映该更改。
【问题讨论】:
标签: swift