2010-01-22 11 views
5

iPhone Adres Defterinden bir kişi için belirli bir e-posta adresini bulmanın bir yolu var mı? Bir kişinin e-posta adreslerinin tamamını nasıl alacağımı biliyorum, nasıl bir e-posta adresini ("ev", "iş" vb.) Nasıl tanımlayacağını değil ... (ve bu tercih edilebilir)), tüm bunların üzerinden yineleme yapmak zorunda kalmadan bu adrese doğrudan erişmenin bir yolu.iPhone Adres Defterindeki bir kişi için "iş" e-posta adresini bulun.

Teşekkürler.

cevap

15

ABMultiValueCopyLabelAtIndex kullanarak kABWorkLabel etiketini kontrol edin. Bir ABRecordRef adında "kişi" varsa

Örneğin, bu kod "emailAddress" adında tek NSString ayarlayacaktır:

// Email address (if only one, use it; otherwise, use the first work email address) 
CFStringRef value, label; 
ABMutableMultiValueRef multi = ABRecordCopyValue(person, kABPersonEmailProperty); 
CFIndex count = ABMultiValueGetCount(multi); 
if (count == 1) { 
    value = ABMultiValueCopyValueAtIndex(multi, 0); 
    emailAddress = (NSString*)value; 
    [emailAddress retain]; 
    CFRelease(value); 
} else { 
    for (CFIndex i = 0; i < count; i++) { 
     label = ABMultiValueCopyLabelAtIndex(multi, i); 
     value = ABMultiValueCopyValueAtIndex(multi, i); 

     // check for Work e-mail label 
     if (label && CFStringCompare(label, kABWorkLabel, 0) == 0) { 
      emailAddress = (NSString*)value; 
      [emailAddress retain]; 
      break; 
     } 

     CFRelease(label); 
     CFRelease(value); 
    } 
} 
CFRelease(multi); 
+3

Sadece tepkisini yoğunlaştırmak için, gizli buradan dışarı çıkar kABWorkLabel olduğunu bir iş adresi. Kodunuzun potansiyel bir sızıntı sorunu olduğuna dikkat edin, e-posta adreslerinin bir dizi e-posta adresi olabileceğinden, e-posta adresi ayarlanmadan önce yayınlanmalı veya döngüden çıkmanız gerekir veya (daha iyisi) iş e-posta adresleri dizisi. –

+0

İyi puanlar. Bunu benim uygulamamdan aldım ve aslında bir mülk (sızıntı) ayarlıyordum ve sadece bir tane almayı düşünüyorum. – gerry3

+1

Birden fazla e-posta adresi ayarlanmışsa ancak iş etiketi atanmamışsa yukarıdaki kod başarısız olur. Birden fazla adres ayarlanmışsa ancak CFStringCompare çökeceğinden etiketlerin eksik olması durumunda da başarısız olur. Yine de bunu göndermek için teşekkürler! –