Frage

Ich versuche das Kontaktbild mit dem folgenden Code festzulegen. Ich sehe keine Fehler, und das Bild wird nicht in der Kontakteingabe im Adressbuch gespeichert. Bitte helfen Sie! Ich muss etwas falsch machen ...

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

Hier ist mein Ausgabeprotokoll:

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

Ich bin mir nicht sicher, warum sich das Fehlerobjekt als ABPEoplepickernAvigationController -Objekt angemeldet hat?

War es hilfreich?

Lösung

Bezüglich Ich bin mir nicht sicher, warum sich das Fehlerobjekt als ABPEoplepickernAvigationController -Objekt angemeldet hat? - Weil Sie die nicht richtig initialisieren error hier:

CFErrorRef error;

Zuordnen nil Hier oder es wird einen zufälligen (oder genaueren vorherigen Speicherwert) haben, der übrigens auf eine zeigt ABPeoplePickerNavigationController Objekt.

In Bezug auf die Verdienste: Sind Sie sicher, dass der Verweis auf person Sie sind an Ihre Methode übergeben, ist im Kontext des Adressbuchs gültig? Ich würde versuchen, eine Funktion wie zu verwenden, z. ABAddressBookGetPersonWithRecordID Erstens anstatt zu bestehen ABPersonRefs um und erwartet, dass sie für verschiedene Adressbuchreferenzen gültig sind.

Andere Tipps

All diese Antwort funktionierte nicht. Sie sollten einfach Ihre Codezeile ändern:

ABAddressBookRef addressBook = ABAddressBookCreate(); 

zu:

ABAddressBookRef addressBook = [peoplePicker addressBook];

Auf diese Weise erhalten Sie den Hinweis auf das "Adressbuch", "Person" gehört zu.

Ich habe auch versucht, das Bild (Foto) der aktuellen ausgewählten Person festzulegen, aber es zeigt eine Massage, um erfolgreich zu speichern, aber in realer IT -Dosis funktioniert nicht !!!

Nachdem das von Apple SDK bereitgestellte Code und die von Apple SDK bereitgestellten Dokumente ausgewählt wurden, habe ich einige mit der folgenden Lösung.

Bitte überprüfen Sie den folgenden Code. Es funktioniert wirklich gut für mich und hoffe auch für Sie.

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

}

Ich habe Ihren Code überprüft und es funktioniert nicht so, wie er sollte. Also habe ich 2 Änderungen vorgenommen.

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

Jetzt funktioniert es so wie es soll.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top