3 Stimmen

Im Vergleich zum PC wird auf mobilen Geräten nur eine begrenzte Anzahl von Pins angezeigt.

Ich lade eine Kartenansicht. Und ich füge der Karte Pins hinzu, die auf den Adressen der Kontakte im Adressbuch basieren. Ich habe einige seltsame Fälle, in denen einige Pins (vielleicht 2 von 10) nicht in der Kartenansicht angezeigt werden. Ich habe die Adresse überprüft, die gültig ist. Aber die Stecknadel fällt nicht ab. Was könnte der Grund dafür sein?

    for (i = 0; i<[groupContentArray count]; i++) {
        person = ABAddressBookGetPersonWithRecordID(addressbook,[[groupContentArray objectAtIndex:i] intValue]);
        ABMultiValueRef addressProperty = ABRecordCopyValue(person, kABPersonAddressProperty);
        NSArray *address = (NSArray *)ABMultiValueCopyArrayOfAllValues(addressProperty);
        NSLog(@"Address %@", address);
        for (NSDictionary *addressDict in address) 
        {
            addAnnotation = nil;
            firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); 
            lastName = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty); 

            NSString *country = [addressDict objectForKey:@"Country"];
            NSString *streetName = [addressDict objectForKey:@"Street"];
            NSString *cityName = [addressDict objectForKey:@"City"];
            NSString *stateName = [addressDict objectForKey:@"State"];

            if (streetName == (id)[NSNull null] || streetName.length == 0 ) streetName = @"";
            if (stateName == (id)[NSNull null] || stateName.length == 0 ) stateName = @"";
            if (cityName == (id)[NSNull null] || cityName.length == 0 ) cityName = @"";
            if (country == (id)[NSNull null] || country.length == 0 ) country = @"";

            NSString *fullAddress = [streetName stringByAppendingFormat:@"%@/%@/%@", cityName, stateName, country];
            mapCenter = [self getLocationFromAddressString:fullAddress];
            if(stateName != NULL || country != NULL || streetName != NULL || cityName != NULL){

                if ((mapCenter.latitude == 0) && (mapCenter.longitude == 0))
                {
                    // Alert View
                }
                else{
                addAnnotation = (MyAddressAnnotation *)[mapView dequeueReusableAnnotationViewWithIdentifier:[groupContentArray objectAtIndex:i]];

                if(addAnnotation == nil){
                    addAnnotation = [[[MyAddressAnnotation alloc] initWithCoordinate:mapCenter title:firstName SubTitle:lastName Recordid:[groupContentArray objectAtIndex:i] ]autorelease];

                    [mapView addAnnotation:addAnnotation];}
                                    }
            }
        }
        CFRelease(addressProperty);

    }

Bearbeiten: Ich ändere meine Frage und präzisiere sie. Ich verwende den Code, um Pins auf meiner mapView abzulegen. Auf meinem Mac PC, wenn es 20 Pins in der Karte fallen gelassen werden. Alle 20 Pins werden korrekt abgelegt und funktionieren einwandfrei. Aber wenn ich IPhone oder IPad verwende, reduziert sich die Anzahl der Pins massiv. Das heißt, von den 20 Pins, die ich fallen lasse, werden nur 4 Pins auf der Karte angezeigt. Ich bin nicht in der Lage, einen Grund dafür herauszufinden.

2voto

Dieser Code:

else {
    addAnnotation = (MyAddressAnnotation *)[mapView dequeueReusableAnnotationViewWithIdentifier:[groupContentArray objectAtIndex:i]];

    if (addAnnotation == nil) {
        addAnnotation = [[[MyAddressAnnotation alloc] initWithCoordinate:mapCenter title:firstName SubTitle:lastName Recordid:[groupContentArray objectAtIndex:i] ]autorelease];

        [mapView addAnnotation:addAnnotation];
    }
}

macht keinen Sinn.

Die dequeueReusableAnnotationViewWithIdentifier Methode ist für die Entnahme aus der Warteschlange MKAnnotationView Objekte -- nicht id<MKAnnotation> Objekte.

Der Dequeuing-Code gehört in die viewForAnnotation Delegate-Methode sowieso, nicht hier.

Hier sollten Sie einfach Ihre Anmerkungsobjekte erstellen ( MyAddressAnnotation ) und rufen addAnnotation über sie.

Ich empfehle Ihnen auch, den Namen Ihrer Anmerkungsvariablen von addAnnotation zu etwas anderem, damit man sie nicht mit der Methode der Kartenansicht verwechseln kann addAnnotation .

0voto

Xavi Valero Punkte 2047

Mein Fehler. In der Zeichenkette "fulladdress" (zwischen streetName und cityName), die ich verwende, waren nicht durch ein Leerzeichen oder "," oder "/" getrennt. Daher wurden einige der Adressen nicht erkannt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X