Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IOS联系人的邮政地址(Xamarin.Forms)_C#_Ios_Xamarin_Xamarin.forms_Xamarin.ios - Fatal编程技术网

C# IOS联系人的邮政地址(Xamarin.Forms)

C# IOS联系人的邮政地址(Xamarin.Forms),c#,ios,xamarin,xamarin.forms,xamarin.ios,C#,Ios,Xamarin,Xamarin.forms,Xamarin.ios,我正在Xamarin.Forms项目中编写一个C#应用程序,其中显示联系人姓名和街道地址。我无法从CNContact中提取地址并将联系人地址分配给字符串 这将是显而易见的,但我被卡住了 public List<Contact> GetContacts() { contactList = new List<Contact>(); var store = new Contacts.CNContactStore();

我正在Xamarin.Forms项目中编写一个C#应用程序,其中显示联系人姓名和街道地址。我无法从CNContact中提取地址并将联系人地址分配给字符串

这将是显而易见的,但我被卡住了

    public List<Contact> GetContacts()
    {
        contactList = new List<Contact>();

        var store = new Contacts.CNContactStore();

        var ContainerId = new CNContactStore().DefaultContainerIdentifier;
        var predicate = CNContact.GetPredicateForContactsInContainer(ContainerId);

        var fetchKeys = new NSString[] { CNContactKey.Identifier, CNContactKey.GivenName, CNContactKey.FamilyName, CNContactKey.Birthday, CNContactKey.PostalAddresses, CNContactKey.ImageData };

        NSError error;

        var IPhoneContacts = store.GetUnifiedContacts(predicate, fetchKeys, out error);

        foreach(var c in IPhoneContacts)
        {
            var contact = new Contact();

            contact.FirstName = c.GivenName;
            contact.FamilyName = c.FamilyName;

            if(c.PostalAddresses.Length !=0)
            {
                contact.StreetAddress = CNPostalAddressFormatter.GetStringFrom(c.PostalAddresses, CNPostalAddressFormatterStyle.MailingAddress);
            };

            contactList.Add(contact);
        }

        return contactList;
    }
public List GetContacts()
{
contactList=新列表();
var store=新联系人。CNContactStore();
var ContainerId=新的CNContactStore().DefaultContainerIdentifier;
var predicate=CNContact.GetPredicateForContactsInContainer(ContainerId);
var fetchKeys=new NSString[]{CNContactKey.Identifier,CNContactKey.GivenName,CNContactKey.FamilyName,CNContactKey.Birthday,CNContactKey.PostalAddresses,CNContactKey.ImageData};
n误差;
var IPhoneContacts=store.GetUnifiedContacts(谓词、fetchkey、out错误);
foreach(IPhoneContacts中的var c)
{
var触点=新触点();
contact.FirstName=c.GivenName;
contact.FamilyName=c.FamilyName;
如果(c.PostalAddresses.Length!=0)
{
contact.StreetAddress=CNPostalAddressFormatter.GetStringFrom(c.postalAddress,CNPostalAddressFormatterStyle.MailingAddress);
};
联系人列表。添加(联系人);
}
返回联系人列表;
}
在iOS中:

首先,您需要在
Info.plist
中添加跟随权限:

<key>NSContactsUsageDescription</key>  
<string>This app requires contacts access to function properly.</string>
第三个,创建函数以获取信息:

public List<ContactModel> ReadContacts()
{
    var response = new List<ContactModel>();
    try
    {
        //We can specify the properties that we need to fetch from contacts  
        var keysToFetch = new[] {
    CNContactKey.PhoneNumbers, CNContactKey.GivenName, CNContactKey.FamilyName,CNContactKey.PostalAddresses,CNContactKey.PhoneNumbers
};
        //Get the collections of containers  
        var containerId = new CNContactStore().DefaultContainerIdentifier;
        //Fetch the contacts from containers  
        using (var predicate = CNContact.GetPredicateForContactsInContainer(containerId))
        {
            CNContact[] contactList;
            using (var store = new CNContactStore())
            {
                contactList = store.GetUnifiedContacts(predicate, keysToFetch, out
                    var error);
            }
            //Assign the contact details to our view model objects  
            response.AddRange(from item in contactList
                                where item?.EmailAddresses != null
                                select new ContactModel
                                {
                                    PhoneNumbers = item.PhoneNumbers,
                                    PostalAddresses = CNPostalAddressFormatter.GetStringFrom(item.PostalAddresses[0].Value, CNPostalAddressFormatterStyle.MailingAddress),
                                    GivenName = item.GivenName,
                                    FamilyName = item.FamilyName
                                });
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
    return response;
}

问题在于
CNPostalAddressFormatter.GetStringFrom()
方法需要单个对象作为参数,但您正在传递单个联系人的所有地址,因为该属性是
CNLabeledValue
对象的数组

您应该做的是迭代所有地址,或者默认情况下只取第一个地址。这取决于你想要实现什么

例如,这将获得第一个
CNPostalAddress

contact.StreetAddress = CNPostalAddressFormatter.GetStringFrom(c.PostalAddresses[0].Value, CNPostalAddressFormatterStyle.MailingAddress);
此外,如果您想知道地址标签(家庭、工作等),您可以这样获得:

c.PostalAddresses[0].Label
那么实际的
CNPostalAddress
对象也是这样:

c.PostalAddresses[0].Value

我遇到的问题是街道地址,而不是电话号码。我编写的上述代码适用于联系人的所有其他元素。为了简化这个论坛的代码,我删除了图片和生日的代码。@Newbee抱歉没有指出原因。我会更新答案。蒂莫·萨洛姆基的答案是正确的。谢谢。你是最棒的!不客气,请记住将正确答案标记为已回答:)
public static string GetStringFrom (Contacts.CNPostalAddress postalAddress, Contacts.CNPostalAddressFormatterStyle style);
contact.StreetAddress = CNPostalAddressFormatter.GetStringFrom(c.PostalAddresses[0].Value, CNPostalAddressFormatterStyle.MailingAddress);
c.PostalAddresses[0].Label
c.PostalAddresses[0].Value