我已将ABPeoplePickerNavigationController添加到我的第一个视图控制器中.我想要当我选择一个联系人显示信息显示在其他视图控制器,但我正在尝试使用我的代码,这不会显示从来没有当我点击联系人.这只能将联系人打开为本机应用程序ABPeoplePickerNavigationController.
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!) {

    var unmanagedEmails = ABRecordcopyValue(people,kABPersonEmailProperty)
    let emailObj: ABMultiValueRef = Unmanaged.fromOpaque(unmanagedEmails.toOpaque()).takeUnretainedValue() as NSObject as ABMultiValueRef

    var index = 0 as CFIndex

    var unmanagedEmail = ABMultiValuecopyValueAtIndex(emailObj,index)
    var emailAddress:String = Unmanaged.fromOpaque(unmanagedEmail.toOpaque()).takeUnretainedValue() as NSObject as String

    println(emailAddress)      
}

谢谢!

几个想法:

>你设置peoplePickerDelegate属性的人选择器控制器?如果你不这样做,就不会在课堂上尝试这些方法.从而:

people.peoplePickerDelegate = self
presentViewController(people,animated: true,completion: nil)

>当您调用ABRecordcopyValue时,您的示例方法引用了人.这是你的选择器控制器.我假设你的意思是引用人,ABRecordRef!作为参数传递.

您可能还想确保您在尝试访问电子邮件之前确实有一个电子邮件地址.您可以使用ABMultiValueGetCount.

我也认为你也可以从Opaque / toOpaque舞蹈中消除.

这产生:

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController,didSelectPerson person: ABRecord) {
    let emails: ABMultiValueRef = ABRecordcopyValue(person,kABPersonEmailProperty).takeRetainedValue()
    if ABMultiValueGetCount(emails) > 0 {
        let index = 0 as CFIndex
        let emailAddress = ABMultiValuecopyValueAtIndex(emails,index).takeRetainedValue() as! String

        print(emailAddress)
    } else {
        print("No email address")
    }
}

>如果您还需要支持iOS 7,请使用:

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController,shouldContinueAfterSelectingPerson person: ABRecord,property: ABPropertyID,identifier: ABMultiValueIdentifier) -> Bool {
    let multiValue: ABMultiValueRef = ABRecordcopyValue(person,property).takeRetainedValue()
    let index = ABMultiValueGetIndexForIdentifier(multiValue,identifier)
    let email = ABMultiValuecopyValueAtIndex(multiValue,index).takeRetainedValue() as! String

    print("email = \(email)")

    peoplePicker.dismissViewControllerAnimated(true,completion: nil)

    return false
}

>但是,您可能不是假设用户只想要第一个电子邮件地址,而是让他们点击并选择联系人可能的多个电子邮件地址之一.所以,首先,你可能想要消除一些“噪音”,告诉选择器你只想看到电子邮件地址:

people.peoplePickerDelegate = self
people.displayedProperties = [NSNumber(int: kABPersonEmailProperty)]
presentViewController(people,completion: nil)

然后,删除我们一直在讨论的先前的方法,而不是实现:

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!,didSelectPerson person: ABRecordRef!,identifier: ABMultiValueIdentifier) {
    let multiValue: ABMultiValueRef = ABRecordcopyValue(person,index).takeRetainedValue() as String

    println("email = \(email)")
}

而且,为了支持iOS 7,您还可以添加:

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController,completion: nil)

    return false
}

>顺便说一下,iOS 8提供了一个功能来控制联系人是否启用.由于您支持iOS 7和8,您需要有条件地使用,例如:

if people.respondsToSelector(Selector("predicateForEnablingPerson")) {
    people.predicateForEnablingPerson = nspredicate(format: "emailAddresses.@count > 0")
}

这给用户可视化指示是否还有个人的电子邮件地址,并阻止他们选择没有电子邮件地址的条目.

显然,如果使用iOS 9和更高版本,您应该退出所有这些,并使用ContactsUI框架,这进一步简化了代码.

如何在Swift中与ABPeoplePickerNavigationController选择联系人?的更多相关文章

  1. ios – 如何告诉ABPeoplePickerNavigationController仅列出具有电子邮件地址的联系人?

    解决方法我不相信有办法让iOS进行这种过滤.我也是在代码中做的.请注意,您需要查找各种电子邮件地址–您必须遍历您可以获得的字典.使用它是一个PITA肯定–我以前做过–你必须小心不要有内存泄漏.我所做的就像你建议的那样–我自己遍历所有联系人,然后我用表格弹出一个视图,然后选择他们想要的人的名字.我保持一个关联,所以我知道什么地址与什么名称相关联,然后使用系统电子邮件框架,然后填充发送地址.

  2. Swift iOS9新联系人框架 – 如何仅检索具有有效电子邮件地址的CNContact?

    您不能编写自定义谓词来过滤联系人,正如文档所说:“请注意,Contacts框架不支持通用谓词和复合谓词”但是当然你可以“手动”完成它,我给你看一个使用快速枚举的例子:

  3. 如何在Swift中与ABPeoplePickerNavigationController选择联系人?

    如果你不这样做,就不会在课堂上尝试这些方法.从而:>当您调用ABRecordcopyValue时,您的示例方法引用了人.这是你的选择器控制器.我假设你的意思是引用人,ABRecordRef!

  4. swift – 使用Firebase登录时“访问钥匙串时出错”

    PS.对不起,如果我错过任何东西,这是我第一次发布.尝试打开项目目标的功能钥匙串共享.这对我有用KeychainSharing

  5. android – 在Kindle Fire上,是否可以获取用户的电子邮件地址?

    Thisquestion一般会讨论Android设备,但是如果你试图在KindleFire上运行这个代码,你得到的就是用户的名字.有没有办法获得电子邮件地址?对不起,但你完全错了.我以前链接到Google登录对话框,显示KindleFire上存在的所有用户.请遵循以下代码:P/s:要使用GoogleAuthUtil类,可能需要google-oauth-client-1.15.0-rc.jar.

  6. Windows – 获取用户的电子邮件地址?

    有没有办法通过Win32或.NET从Windows中获取用户的电子邮件地址?是否有包含此信息的注册表项或API?

  7. ubuntu – 如何将副本发送到电子邮件帐户中所有传入邮件的另一个电子邮件地址?(后缀)

    (后缀)这是可能的?

  8. ubuntu – 配置Exim转发电子邮件

    我设置了一个Ubuntu10.04VPS来管理sub.example.com,我已经将Exim配置为使用来自LinodeLibrary的thistutorial发送电子邮件.这是有效的,但除了发送电子邮件,我意识到我需要一个非根电子邮件地址(admin@sub.example.com)转发给我(me@gmail.com).我已经阅读了关于这个[1]的Exim文档,我并没有真正得到我应该做的事情(似

  9. 通过PHP向许多用户发送邮件的安全方式

    让我解释一下我的话题.比方说,我正在为一个网上商店/目录创建一个小型的电子商务系统.客户有可能选择,他们是否希望接收通讯.如果他们这样做,那么逻辑上认为通讯应该在通讯形成并准备就绪时立即发送.当然,通过从数据库中获取所有指定的用户电子邮件和循环使用循环邮件功能发送邮件,可以简单的做到这一点,但问题是我被告知这是不好的做法.简单而不便宜的方式是购买互联网服务发送通讯,但是需要PHP程序员呢?

  10. php – 在数据库中存储有关匿名/访客用户的信息的方法有哪些?

    >如果不在数据库中,则外键约束从transaction.customer_ID到customer.customer_ID不再工作>customer_ID与公司party_ID相同>更容易确定每个公司的总销售额等>这会使事情变得混乱,因为公司是自己的客户,而不是其他独特的客户>为每个新的匿名客户生成一个唯一的customer_ID>如果同一个物理用户返回怎么办?

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部