2012-05-27 34 views
13

अपडेट करने के लिए तो मेरे पास मेरे सभी पिन जोड़े गए एमकेमैप व्यू हैं, और पिन का रंग इस पिन पर एक मान सेट है या नहीं, इस पर निर्भर है। जब मैं पहली बार ऐप लोड करता हूं, viewForAnnotation कहा जाता है और रंग तदनुसार सेट होते हैं। हालांकि, जब मैं पिन के विवरण अपडेट करता हूं (जैसे स्थान, शीर्षक, इत्यादि ...) मैं पिनकॉलर को अपडेट भी ढूंढता हूं ताकि यह अपडेट न हो। ऐसा लगता है कि शुरुआती ऐड के बाद viewForAnnotation को फिर से नहीं कहा जाता है।फोर्स MKMapView viewForAnotation

मैं इस के समान कई सवाल पढ़ लिया है और मैं पुष्टि कर सकता है कि mapView.delegate = self;

यहाँ मेरी viewForAnnotation कोड है:

CLLocationCoordinate2D annotationCoord; 
annotationCoord.latitude = latestPosition.latitude; 
annotationCoord.longitude = latestPosition.longitude; 

MapAnnotation *annotation = [[MapAnnotation alloc] init]; 
annotation.coordinate = annotationCoord; 
annotation.identifier = theIdentifier; 
annotation.title = theTitle; 
annotation.subtitle = theSubtitle 
annotation.pinColour = [self getPinColour]; 
annotation.counter = theCounter; 

[theMapView addAnnotation:annotation]; 
:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(MapAnnotation *)annotation 
{ 
    if([annotation class] == MKUserLocation.class) 
     return nil; 

    NSString *pinIdentifier = annotation.identifier; // This is a unique string for each pin and is getting populated every time! 

    MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:pinIdentifier]; 

    if(annotationView == nil) 
     annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinIdentifier]; 
    else 
     annotationView.annotation = annotation; // Never had this line fire... 

    annotationView.canShowCallout = YES; 
    annotationView.animatesDrop = NO; 
    annotationView.enabled = YES; 
    annotationView.tag = annotation.counter; 

    if(annotation.pinColour == Stopped) // from enum 
     annotationView.pinColor = MKPinAnnotationColorRed; 
    else 
     annotationView.pinColor = MKPinAnnotationColorGreen; 

    UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    [infoButton addTarget:self action:@selector(mapCalloutButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
    infoButton.tag = annotation.counter; 
    annotationView.rightCalloutAccessoryView = infoButton; 

    return annotationView; 
} 

यहाँ कोड है, जहां मैं पिन जोड़ने है

यहां कोड है जहां मैं पिन अपडेट करता हूं (जोड़ने के लिए अलग-अलग विधि):

updatePin = true; 
pinCounter = mapPin.counter; 

CLLocationCoordinate2D annotationCoord; 
annotationCoord.latitude = latestPosition.latitude; 
annotationCoord.longitude = latestPosition.longitude; 
[mapPin setCoordinate:annotationCoord]; 

mapPin.identifier = theIdentifier; 
mapPin.subtitle = theSubtitle; 
mapPin.pinColour = [self getPinColour]; 

मुझे यकीन नहीं है कि मैं क्या खो रहा हूं। viewForAnnotation स्पष्ट रूप से काम कर रहा है, इसे प्रारंभिक जोड़ के बाद कभी नहीं बुलाया जाता है! अगर यह इस फ़ंक्शन को कॉल करना था तो मुझे 100% यकीन है कि यह काम करेगा क्योंकि अगर मैं ऐप को पुनरारंभ करता हूं तो रंग बदल जाता है!

संपादित करें: ओह और मैं वास्तव में एनोटेशन को हटाने और उन्हें फिर से जोड़ने शुरू नहीं करना चाहता हूं। वैसे भी मैं छोटी अवधि में क्या कर रहा हूं!

उत्तर

12

नक्शा व्यू अपनी टिप्पणियों को कैश करने के तरीके के कारण, आपको एनोटेशन को हटाने और फिर से जोड़ने की आवश्यकता है यदि आपको इसकी उपस्थिति में बदलाव करने की आवश्यकता है। एक साधारण निकालना & जोड़ने का तरीका है। कोई कैश तंत्र को अमान्य नहीं कर रहा है लेकिन यह।

+0

आह धन्यवाद। मैं वास्तव में ऐसा नहीं करना चाहता था लेकिन मैंने कॉलआउट व्यू को बनाए रखने में कामयाब रहा है, इसलिए अब आप यह नहीं बता सकते! मैं इसे उत्तर के रूप में चिह्नित करूंगा क्योंकि मुझे नहीं पता था कि यह एकमात्र तरीका था। –

+0

नहीं, यह सही उत्तर नहीं है, नीचे देखें –

+0

यह काम नहीं करता है। – Aggressor

36

असल में, मुझे नहीं पता कि यह आपके लिए काम करता है लेकिन इस तरह मैंने इसे किया।

मुझे मानचित्र से एनोटेशन हटाने की आवश्यकता नहीं थी। मुझे केवल पैरामीटर एनोटेशन के लिए एनोटेशन व्यू देने के लिए मानचित्र को बताना है। नक्शा सही एनोटेशन वापस कर देगा। वहां से, मेरे पास मेरी कस्टम एनोटेशन के लिए एक संपत्ति है यह पहचानने के लिए कि क्या यह एक सक्रिय आइटम है, यदि हां, सामान्य पिन छवि दिखाएं, तो पूर्ण पिन छवि दिखाएं।

-(void)updateAnnotationImage:(CustomAnnotation *)paramAnnotation 
{ 
    MKAnnotationView *av = [geoMap viewForAnnotation:paramAnnotation]; 

    if (paramAnnotation.active) 
    { 
     av.image = [UIImage imageNamed:@"PinNormal.png"]; 
    } 
    else 
    { 
     av.image = [UIImage imageNamed:@"PinFull.png"]; 
    } 
} 

देर से बिट लेकिन उम्मीद है कि यह इस समस्या से निपटने वाले अन्य लोगों की सहायता करता है।

+0

यह संभव है और यह सही तरीका है .. उत्तर के लिए +1। –

+0

यह वास्तव में स्वीकार्य उत्तर होना चाहिए। धन्यवाद! – lostintranslation

0

स्विफ्ट 2.1 फोन:

मैं एक ही मुद्दा था, और पाया एक त्वरित समाधान, इस जब गति प्रदान आवश्यक है, इसे मुख्य धागे पर भी भेजना बुद्धिमान होगा:

var annotationsArray = mapView.annotations 
mapView.removeAnnotations(mapView.annotations) 
mapView.addAnnotations(arrayIncs) 
arrayIncs.removeAll() 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^