Question

Je suis en train de définir l'image de contact avec le code ci-dessous. Je ne vois aucune erreur, et l'image n'a pas été sauvegardé à l'entrée de contact dans le carnet d'adresses. S'il vous plaît aider! Je dois faire quelque chose de mal ...

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
[abcontroller setDisplayedPerson:person];

UIImage *im = [UIImage imageNamed:@"image1.jpg"];
NSData *dataRef = UIImagePNGRepresentation(im);
CFErrorRef error;
ABAddressBookRef addressBook = ABAddressBookCreate(); 

NSLog(@"Error:",error);
    if (ABPersonSetImageData(person, (CFDataRef)dataRef, &error))
    {
        NSLog(@"Set contact photo %@", error);
        if (ABAddressBookHasUnsavedChanges(addressBook))
        {
            NSLog(@"Changes made to address book");
        }
        else {
            NSLog(@"No changes made to address book");
        }

        if (ABAddressBookSave(addressBook, &error))
        {
            NSLog(@"Saved");

        }
        else {
            NSLog(@"Not saved");
        }


    }
    else {
        NSLog(@"Error saving contact photo %@", error);
    }
ABAddressBookSave(addressBook, &error);

[self dismissModalViewControllerAnimated:YES];    

return NO;
}

Voici mon journal de sortie:

2010-01-17 21:58:35.465 Error:
2010-01-17 21:58:35.504 Set contact photo <ABPeoplePickerNavigationController: 0x19e9b0>
2010-01-17 21:58:43.497 No changes made to address book
2010-01-17 21:58:44.724 Saved

Je ne sais pas pourquoi l'objet d'erreur est l'exploitation forestière comme un objet ABPeoplePickerNavigationController?

Était-ce utile?

La solution

En ce qui concerne Je ne sais pas pourquoi l'objet d'erreur est l'exploitation forestière comme un objet ABPeoplePickerNavigationController - parce que vous n'êtes pas bien ici initialisant le error:

CFErrorRef error;

Assigner nil ici, ou il aura une valeur aléatoire (ou plus précisément, de la mémoire précédente), pointant d'ailleurs un objet ABPeoplePickerNavigationController.

En ce qui concerne le fond: êtes-vous sûr que la référence à vous person avez passé à votre méthode est valable dans le contexte du carnet d'adresses? Je voudrais essayer d'utiliser une fonction telle que ABAddressBookGetPersonWithRecordID d'abord, au lieu de passer ABPersonRefs autour et les attendant d'être valables pour différentes références du carnet d'adresses.

Autres conseils

Toutes ces réponses ne fonctionnait pas. Vous devez simplement changer votre ligne de code:

ABAddressBookRef addressBook = ABAddressBookCreate(); 

à:

ABAddressBookRef addressBook = [peoplePicker addressBook];

De cette façon, vous obtenez la référence au « carnet d'adresses », « personne » appartient.

Je aussi utiliser pour définir l'image (photo) de la personne actuellement sélectionnée mais afficher massage enregistré avec succès, mais dans la vraie dose, il fonctionne pas !!!

après le creusement du code et les documents fournis par Apple SDK, j'ai un peu avec la solution suivante.

S'il vous plaît vérifier le code ci-dessous. son travail vraiment bien pour moi et l'espoir pour vous aussi.

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
    @try {
        CFErrorRef cfError = nil;

        if (ABPersonHasImageData(person)) {
            NSLog(@"%s has an image", _cmd);

            //theAlert = [[UIAlertView alloc] initWithTitle:@"Contact already has an image" message:@"Are you sure you want to overwrite it?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Overwrite"];
            //[theAlert show];
            //[theAlert release];
            //Note: We do not yet handle the answer to this question
        }

        // Just a sanity check

        if ((nil == [imageView image])
            || (nil == UIImagePNGRepresentation([imageView image]))) {
            NSLog(@"%s NIL STUFF", _cmd);
        }

        // Not sure I even need to create and save an address book
        // Cf. https://devforums.apple.com/message/27512#27512
        ABAddressBookRef libroDirec = ABAddressBookCreate();
        ABPersonSetImageData(person, (CFDataRef) (UIImageJPEGRepresentation([imageView image], 1.0f)), &cfError);
        ABAddressBookAddRecord(libroDirec, person, &cfError);
        if (ABAddressBookSave(libroDirec, nil)) {
            NSLog(@"%s saved successfuly", _cmd);
        } else {
            NSLog(@"%s something bad happen while saving", _cmd);
        }
        CFRelease(libroDirec);
    }
    @catch (NSException * e) {

    }
    @finally {

    }
    // TODO: release peoplePicker (and refactor code to not have it global)
    [self dismissModalViewControllerAnimated:YES];

    return NO;

}

J'ai vérifié votre code et il ne fonctionne pas comme il se doit. Donc, j'ai fait 2 changements.

ABAddressBookRef libroDirec = [peoplePicker addressBook];//don't create
        ABPersonSetImageData(person, (CFDataRef)UIImagePNGRepresentation(display.image), &cfError);
        ABAddressBookAddRecord(libroDirec, person, &cfError);

        if (ABAddressBookSave(libroDirec, nil)) {
            NSLog(@"\n%s saved successfuly", _cmd);
        } else {
            NSLog(@"\n%s something bad happen while saving", _cmd);
        }
        //CFRelease(libroDirec);

Maintenant, il fonctionne comme il se devait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top