10 berichten aan het bekijken - 1 tot 10 (van in totaal 10)
  • Q:
    Bijdrager
    jimeh

    App crasht bij gebruik AdressBook framework

    Hey, ik ben bezig met een app voor iOs en op een bepaald moment moeten gebruikers email adressen invoeren van hun contacten dit werkt tot nu toe prima totdat je iemand selecteert die geen email-adres heeft dan crasht de app, ik heb al wat rond gezocht maar ik word niet wijs uit de apple documentatie en online was verder niets te vinden.
    Weet iemand hier misschien een oplossing voor? (de console geeft verder ook geen meldingen)

    -(IBAction)chooseContacts {
    	ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
    
    	picker.peoplePickerDelegate = self;
    
    	// showing the picker
    	[self presentModalViewController:picker animated:YES];
    	// releasing
    	[picker release];
    
    }
    - (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)chooseContacts {
        // assigning control back to the main controller
    	[self dismissModalViewControllerAnimated:YES];
    }
    - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {
    
    	if (ABRecordCopyValue(person, kABPersonEmailProperty)) {
    		NSLog(@"Geen Error%@", ABMultiValueCopyValueAtIndex(ABRecordCopyValue(person,kABPersonEmailProperty) ,0));
    		if([receivers.text length] != 0){
    			receivers.text = [receivers.text stringByAppendingString:@", "];
    		}
    		receivers.text = [receivers.text stringByAppendingString:ABMultiValueCopyValueAtIndex(ABRecordCopyValue(person,kABPersonEmailProperty) ,0)];
    	} else {
    		NSLog(@"Error");
    	}
    
        [self dismissModalViewControllerAnimated:YES];
    
        return NO;
    
    }
    - (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{
        return NO;
    }
    

    alvast bedankt!

    Bijdrager
    Koetjesreep

    Tjah, we kunnen gaan gokken, maar hoe staat alles gedeclareerd, verwacht hij ook daadwerkelijk een email adres en als er geen is staat hij dan op “” of Nill of hoe word dat precies afgehandeld? Want als hij wel iets verwacht, maar hij krijgt het niet mee (de ontvanger wil een email, maar de verzender geeft null) dan crasht hij.

    Bijdrager
    bitsflew

    Wijzig de volgende regel:

    <br />
    if (ABRecordCopyValue(person, kABPersonEmailProperty)) {<br />
     

    naar:

    <br />
    ABMultiValueRef value = ABRecordCopyValue(person, kABPersonEmailProperty);<br />
    if (value && ABMultiValueGetCount(value) > 0) {<br />
     
    Bijdrager
    jimeh

    @bitsflew
    Super bedankt!
    er gaat nu nog 1 dingetjes fout op deze regel

    <br />
    receivers.text = [receivers.text stringByAppendingString:ABMultiValueCopyValueAtIndex(ABRecordCopyValue(person,kABPersonEmailProperty) ,0)];<br />
     

    daar krijg ik de melding: Passing argument 1 of ‘stringByAppendingString:’ discards qualifiers from pointer target type
    weet je hier misschien ook een oplossing voor?

    Bijdrager
    Verwijder

    In de Mac-versie van de documentatie staat bij Return Value steeds “You are responsible for releasing this object.”. Als dit onder iOS ook zo is (er zit Copy in de naam) dan lekt je programma een beetje.
    Wat geeft ABMultiValueCopyValueAtIndex terug? Kan je dit niet simpelweg casten naar een NSString*?

    Bijdrager
    lord anubis

    Je beseft dat @bitsflew laat zien dat het een multi value is.
    Je moet dus door de lijst heen lopen en iedere value testen.
    zoiets als

    <br />
    NSString *email;<br />
    ABMultiValueRef value = (ABMultiValueRef) ABRecordCopyValue(person, kABPersonEmailProperty);<br />
    if (value && ABMultiValueGetCount(value) > 0) {<br />
        for (CFIndex i = 0; i < ABMultiValueGetCount(value); i++) {<br />
            emai = (NSString *)ABMultiValueCopyValueAtIndex(value, i);<br />
            NSLog([NSString stringWithFormat:@"Email: %@", email]);<br />
            // test of er rare tekens inzitten voordat je het gebruikt<br />
            if (! [email isEqualToString:@""] ) { // create your test here<br />
                 if([receivers.text length] != 0){<br />
                      receivers.text = [receivers.text stringByAppendingString:@", "];<br />
                 }<br />
                 receivers.text = [receivers.text stringByAppendingString:email];<br />
            }    // end if<br />
        }<br />
    }<br />
    [email release];<br />
     
    Bijdrager
    Verwijder

    Als ik in adresboek een e-mailadres leeg laat dan verdwijnt het. Ik dacht dat jimeh per persoon alleen het eerste adres wilde hebben.
    p.s. [email release] moet binnen de loop anders komen er crashes en leaks. (ja, ik ben een muggenzifter)

    Bijdrager
    lord anubis
    Willemien op 28 april 2011

    Als ik in adresboek een e-mailadres leeg laat dan verdwijnt het.

    Muggeziften? Dan zou jij zeker daar niet blindelings op vertrouwen ;-), altijd testen! Het gaat er om dat hij het email adres test op geldigheid, misschien zelfs op een pattern of provider. Niet alles hoeft voor gekauwd te worden.

    Bijdrager
    Verwijder

    Dat muggenziften sloeg op [email release].
    Wat jimeh test en gebruikt mag hij zelf weten en maken, we weten niet wat er verder mee gebeurt. Het nadeel van testen is dat er een foutje in kan zitten of dat niet alle situaties zijn voorzien en er ten onrechte wordt afgekeurd. Dat vinden gebruikers vervelender dan dat hun eigen typefouten worden overgenomen.

    Bijdrager
    defores

    Heb je wel het adressenboek framework toegevoegd aan het project? (dus niet alleen het object).

10 berichten aan het bekijken - 1 tot 10 (van in totaal 10)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.