我刚刚进入斯威夫特,我绊倒了这个。我想在方法
中获取联系人的联系人图像func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecord!, property: ABPropertyID, identifier: ABMultiValueIdentifier)
首先检查联系人是否有图像,然后用
将其复制到新创建的常量中if(ABPersonHasImageData(person))
{
let avatar : NSData = ABPersonCopyImageDataWithFormat(person, kABPersonImageFormatThumbnail).takeRetainedValue()
}
问题是,它总是在模拟器中返回false。还不能在真正的手机上试试。 我究竟做错了什么?没有错误。从联系人中提取所有其他信息就可以了。
答案 0 :(得分:1)
刚才修好了。在工作中尝试之后,我对代码进行了比较,并注意到我遗漏了一件事,这让它起作用了:
这一行:
pickerController.displayedProperties = [NSNumber(int: kABPersonPhoneProperty)]
我从未想过这是问题,因为图片显示在联系人视图中。当然,我现在需要知道如何在该列表中包含联系人的UIImage,但由于它不像kABPersonPhoneProperty
那样可用,我真的不知道如何做到这一点。
这可能是个错误吗?难道我不能获得图像,即使上述行除了电话号码之外的所有内容都不包括在内吗?
我的解决方法是实施
func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecord!) {
//get the image, then hide everything except phone numbers
}
然后在下一步中定义隐藏在联系人视图中的内容。但这不是很好吗?
也许有人知道更好的解决方案。非常感谢!
答案 1 :(得分:0)
好吧,毕竟好像没有问题。我刚刚尝试了我的第一篇文章的代码,它的确有效。在我的设备上和同一个模拟器上......
自从我第一次遇到这个问题后,我重新安装了Xcode,也许这解决了它而没有我注意到。奇怪的错误......
尽管如此:(非)问题解决了!
答案 2 :(得分:0)
我想你总是从false
收到ABPersonHasImageData
的原因是你的代码没有访问任何AddressBook数据的权限,除了用户明确选择的数据(电话号码,你的情况)。
要请求权限,请将presentViewController: ...
包裹在ABAddressBookRequestAccessWithCompletion
中(或获取其他位置的权限,但之前您尝试访问该图片)。
e.g。
ABAddressBookRequestAccessWithCompletion(nil) {
(granted:Bool, err:CFError!) in
dispatch_async(dispatch_get_main_queue()) {
if granted {
// TODO: present ABPeoplePickerNavigationController etc.
}
}
}