从联系人中获取街道地址的Swift代码

4

我创建了一个应用程序,用户可以选择联系人然后获取姓名、生日和街道地址。

我可以获取并显示姓名和生日。但是我无法获取街道地址。

这是我的代码:

@IBOutlet weak var names: UILabel!
@IBOutlet weak var birthday: UILabel!
@IBOutlet weak var address: UILabel!

var storeNames = ""
var storeBirthday = ""
var storeAddress = CNLabeledValue()

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true)
    names.text = storeNames
    birthday.text = storeBirthday
    address.text = String(storeAddress)
}

func getDateStringFromComponents(dateComponents: NSDateComponents) -> String! {
    if let date = NSCalendar.currentCalendar().dateFromComponents(dateComponents) {
        let dateFormatter = NSDateFormatter()
        dateFormatter.locale = NSLocale.currentLocale()
        dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
        let dateString = dateFormatter.stringFromDate(date)

        return dateString
    }
    return nil
}

@IBAction func showContacts(sender: AnyObject) {
    let contactPickerViewController = CNContactPickerViewController()
    contactPickerViewController.predicateForEnablingContact = NSPredicate(format: "birthday != nil")
    contactPickerViewController.delegate = self
    presentViewController(contactPickerViewController, animated: true, completion: nil)
}

func contactPicker(picker: CNContactPickerViewController, didSelectContact contact: CNContact) {
    storeNames = contact.givenName //Get Names
    if let bday = contact.birthday?.date as NSDate! {
        let formatter = NSDateFormatter()
        formatter.timeZone = NSTimeZone(name: "UTC")
        formatter.dateFormat = "dd/MM/yyyy"
        let stringDate = formatter.stringFromDate(contact.birthday!.date!)
        //Their birthday as a String:
        storeBirthday = stringDate //Get Birthday
    }

    storeAddress = contact.postalAddresses[0]
    print(storeAddress)
}

它的打印结果如下

<CNLabeledValue: 0x7fca63c12780: identifier=150C06A9-8008-4496-B27A- CE2648622793, label=_$!<Work>!$_, value=<CNPostalAddress: 0x7fca63c0dce0: street=165 Davis Street, city=Hillsborough, state=CA, postalCode=94010, country=, countryCode=us, formattedAddress=(null)>> 2016-12-08 19:35:09.920 Birthdays[638:9739] 插件com.apple.MobileAddressBook.ContactsViewService已失效

抱歉,我不知道如何获取街道地址


storeAddressCNPostalAddress 对象。所以 let streetAddress = storeAddress.street - Larme
Value of type 'CNLabeledValue' has no member 'street' - Ariel Gemilang
让街道地址等于storeAddress.value.street。 - Larme
value of type 'protocol<NSCopying, NSSecureCoding>' has no member 'street' - Ariel Gemilang
2个回答

6

我发现将地址解析为单独的字符串最简单的方法如下:

let emailAddress = contact.emailAddresses.count > 0 ? contact.emailAddresses[0].value : ""
let address = contact.postalAddresses.count > 0 ? "\(contact.postalAddresses[0].value.street)" : ""
let city = contact.postalAddresses.count > 0 ? "\(contact.postalAddresses[0].value.city)" : ""
let state = contact.postalAddresses.count > 0 ? "\(contact.postalAddresses[0].value.state)" : ""
let zipCode = contact.postalAddresses.count > 0 ? "\(contact.postalAddresses[0].value.postalCode)" : ""
let country = contact.postalAddresses.count > 0 ? "\(contact.postalAddresses[0].value.country)" : ""

我这样获取值:

contact.postalAddresses[0].value.street

4
你需要将你的 storeAddress 的值转换为一个 CNPostalAddress 对象,并使用你所需的属性。
if let address = storeAddress.value as? CNPostalAddress {

   let city = address.city
   ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接