Pregunta

Estoy tratando de establecer la imagen de contacto con el código de abajo. No estoy viendo los errores, y la imagen no se guarda en la entrada de contacto en la libreta de direcciones. ¡Por favor ayuda! Debo estar haciendo algo 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;
}

Aquí está mi registro de salida:

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

No estoy seguro de por qué el objeto de error está registrando como un objeto ABPeoplePickerNavigationController?

¿Fue útil?

Solución

En cuanto a No estoy seguro de por qué el objeto de error está registrando como un objeto ABPeoplePickerNavigationController - porque no estás inicializar correctamente el error aquí:?

CFErrorRef error;

Asignar nil aquí, o que tendrá un valor aleatorio (o, más precisamente, parte de la memoria anterior), dicho sea de paso que apunta a un objeto ABPeoplePickerNavigationController.

En cuanto a los méritos: ¿está seguro de la referencia a person que haya pasado a su método es válido en el contexto de la libreta de direcciones? Me gustaría tratar de utilizar una función como ABAddressBookGetPersonWithRecordID en primer lugar, en vez de pasar ABPersonRefs alrededor y esperar que sean válidos para diferentes referencias de libros de direcciones.

Otros consejos

Todas estas respuestas no funcionaba. Simplemente debe cambiar su línea de código a partir de:

ABAddressBookRef addressBook = ABAddressBookCreate(); 

a:

ABAddressBookRef addressBook = [peoplePicker addressBook];

De esta manera se obtiene la referencia a la "libreta de direcciones", "persona" pertenece a.

También he trate de usar para configurar la imagen (foto) de la persona corriente seleccionada pero mostrar masaje para guardado con éxito pero en bienes no dosis trabajar !!!

después de la excavación de código y los documentos proporcionados por Apple SDK, tengo un poco con la siguiente solución.

Por favor, echa un vistazo al siguiente código. su realmente trabaja bien para mí y espero que para usted también.

- (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;

}

Tras revisar su código y no funciona como debería. Así que hice 2 cambios.

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);

Ahora funciona como debería.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top