Valeur null

yafouyafou Membre
07:00 modifié dans API UIKit #1
Bonjour,

Je récupère des contacts du carnet d'adresse.
<br />NSString *pEmail = (NSString *)ABRecordCopyValue(person, kABPersonEmailProperty) ;<br />


Juste après, dans la ligne suivante, il est impossible d'utiliser cet variable avec n'importe qu'elle opération.
C'est dû surement au faite que ce contact n'a pas d'Email.
Je veux tester si cette valeur est null, ça marche pas (même ne NSLog marche pas)
J'ai essayé  != nil et !=NULL
tj pas
la même erreur :
[NSCFType length]: unrecognized selector sent to instance

Qlq1 a une idée , Merci.

Réponses

  • Philippe49Philippe49 Membre
    07:00 modifié #2
    Dans la doc, ABRecordCopyValue n'est pas une chaà®ne

    ABRecordCopyValue
    Returns the value of a record property.

    CFTypeRef ABRecordCopyValue (
      ABRecordRef record,
      ABPropertyID property
    );
    Parameters
    record
    The record containing the property in question.
    property
    The property of record whose value to return. See properties in “Constants” and “Constant
  • Philippe49Philippe49 Membre
    mars 2009 modifié #3
    Plus précisément

    kABPersonEmailProperty
    Email address. Type: kABMultiStringPropertyType.

    kABMultiStringPropertyType
    Multistring property. Returned as an ABMultiValueIdentifier of CFStringRef objects.

    essaie de caster en NSArray, et de faire un NSLog dessus
    NSArray *pEmails = (NSArray *)ABRecordCopyValue(person, kABPersonEmailProperty) ;
    NSLog(@%@",pEmails);


    Quoiqu'à  priori ABMultiValueIdentifier est un int32_t
  • yafouyafou Membre
    07:00 modifié #4
    le NSLog retourne ça:
    <NSCFType: 0x10a9820> !
  • Philippe49Philippe49 Membre
    07:00 modifié #5
    C'est un type intermédiaire opaque

    NSString *pEmail= (NSString*)[(NSArray *)ABRecordCopyValue(person, kABPersonEmailProperty) objectAtIndex:0];
    NSLog(pEmail);

    (remarque: tu permets que je déplace ton post vers la rubrique Frameworks spécialisés ? )
  • yafouyafou Membre
    07:00 modifié #6
    dans 1236166480:

    C'est un type intermédiaire opaque

    NSString *pEmail= (NSString*)[(NSArray *)ABRecordCopyValue(person, kABPersonEmailProperty) objectAtIndex:0];
    NSLog(pEmail);



    ça me retourne ça:
    [NSCFType objectAtIndex:]: unrecognized selector sent to instance 0x10ab740
    Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFType objectAtIndex:]: unrecognized selector sent to instance 0x10ab740'


    (remarque: tu permets que je déplace ton post vers la rubrique Frameworks spécialisés ? )

    Oui bien sûre. Juste on attend stp que je trouve la bonne réponse.
  • Philippe49Philippe49 Membre
    07:00 modifié #7
    Bon c'est que c'est que cela doit être une string alors. Bizarre que ça coince. Normalement les CFStringRef (chaà®nes de bas niveau) sont castables en NSString*

    Bon je n'ai plus le temps là , essaie des fonctions C comme CFStringGetLength(), CFStringGetCharacters() ...  qui sont décrites dans la doc
  • BaardeBaarde Membre
    mars 2009 modifié #8
    NSString * pEmail = nil;<br />ABMultiValueRef mails = (ABMultiValueRef) ABRecordCopyValue(person, kABPersonEmailProperty);<br />if(ABMultiValueCount(mails)) {<br />&nbsp; &nbsp; pEmail = [(NSString *) ABMultiValueCopyValueAtIndex(mails, 0) autorelease];<br />}<br />CFRelease(mails);<br />NSLog(pEmail);
    


    Sinon, pourquoi utiliser la version C du framework AddressBook ?
  • AliGatorAliGator Membre, Modérateur
    mars 2009 modifié #9
    J'ai fait une recherche google sur ABMultiValueIdentifier, et dès les premières pages que je trouve on voit qu'il faut utiliser ABMultiValueCopyValueAtIndex dessus pour récupérer les valeurs.

    [tt]NSLog(@premier email : %@" , ABMultiValueCopyValueAtIndex(ABRecordCopyValue(person, kABPersonEmailProperty),0) );[/tt]

    Sinon dans la doc sur ABMuliValue Reference, on trouve ABMultiValueCopyArrayOfAllValues qui renvoie un CFArrayRef (toll-free bridged donc castable en NSArray*)
    NSArray* emails = (NSArray*) ABMultiValueCopyArrayOfAllValues( ABRecordCopyValue(person, kABPersonEmailProperty) );<br />NSLog(@&quot;emails : %@&quot; , emails); // tu peux l&#39;utiliser comme un NSArray Cocoa maintenant.
    


    Faut penser à  chercher dans la doc :P

    [EDIT]J'avais oublié de valider mon message du coup Baarde a posté avant moi, mais moi j'ai trouvé ABMultiValueCopyArrayOfAllValues qui est tout fait :D
    Du coup aussi pour répondre à  ta question Baarde : le framework Cocoa AddressBook accessible en Objective-C... n'existe que pour MacOSX. Or là  on est sur iPhone, où il n'a pas été porté (je me demande bien pourquoi, c'est pourtant pas le genre de classes lourdes qui ralentirait l'iPhone et justifierait sa suppression). D'où l'obligation de passer par l'API C.
  • BaardeBaarde Membre
    07:00 modifié #10
    Ah oui. Je n'avais pas fait attention à  la plate-forme. A chaque fois, je me fais avoir.
  • yafouyafou Membre
    07:00 modifié #11
    Merci à  tous.
    Ca fonctionne maintenant.
    @+
Connectez-vous ou Inscrivez-vous pour répondre.