2012-03-02 19 views
6

मेरे पास एनोटेशन के साथ एक नक्शा दृश्य है, और ये एनोटेशन कॉलआउट प्रदर्शित करते हैं। जब कॉलआउट का प्रकटीकरण विवरण बटन क्लिक किया जाता है, तो यह एक नए दृश्य में बैठता है।MKMapView एनोटेशन बदलना/खोना आदेश?

मेरा एमकेएएनोटेशन एक कस्टम क्लास है जो <MKAnnotation> लागू करता है। आइए क्लास माई क्लास को कॉल करें। वे एक एनएसएमयूटेबलएरे में संग्रहित होते हैं। इस दृश्य के व्यूलोड के दौरान, मैं इस सरणी में मैप क्लास की एनोटेशन में MyClass के प्रत्येक ऑब्जेक्ट को जोड़ता हूं। डीबगर का उपयोग करके, मैं देख सकता हूं कि यह सब जोड़ने के बाद, [self.MapView एनोटेशन] ऑर्डर NSMutableArray जैसा ही है।

अब मैप के भीतर एक और ब्रेकपॉइंट सेट किया गया व्यू: व्यूफोर नोटेशन: और 1 के ऑर्डर को देखें) मेरे एनएसएमयूटेबलएरे और 2) [self.MapView एनोटेशन]। सरणी एक ही क्रम में निश्चित रूप से है। हालांकि, एनोटेशन का आदेश खराब हो गया है।

यह मेरे लिए एक बड़ी समस्या थी, क्योंकि मुझे MyClass के विशिष्ट उदाहरण का उपयोग करने की आवश्यकता थी जिसे उपयोगकर्ता ने अगले दृश्य में चुना था। एकेए, मैं एनोटेशन को देखना चाहता था, इसकी अनुक्रमणिका ढूंढना चाहता था, और फिर सरणी के भीतर एक ही इंडेक्स प्राप्त करने के लिए इसका उपयोग करना चाहता था।

अब मुझे एहसास हुआ है कि मैं सिर्फ एनोटेशन को सीधे सहेज सकता हूं (एंड्रॉइड पृष्ठभूमि से आ रहा है, यह मेरे लिए बहुत अच्छा था)। हालांकि, मैं अभी भी एक नुकसान में अवधारणात्मक रूप से हूं कि आदेश क्यों खराब हो गया। क्या कोई मेरी मदत कर सकता है? नीचे दिए गए कोड:

- (void)viewDidLoad 
{ 


    if([fromString isEqualToString:@"FromList"]) 
     self.navigationItem.hidesBackButton = TRUE; 
    else { 
     self.navigationItem.rightBarButtonItem = nil; 
    } 


    self.array = [MySingleton getArray]; 
    //set up map 

    //declare latitude and longitude of map center 
    CLLocationCoordinate2D center; 
    center.latitude = 45; 
    center.longitude = 45; 

    //declare span of map (height and width in degrees) 
    MKCoordinateSpan span; 
    span.latitudeDelta = .4; 
    span.longitudeDelta = .4; 

    //add center and span to a region, 
    //adjust the region to fit in the mapview 
    //and assign to mapview region 
    MKCoordinateRegion region; 
    region.center = center; 
    region.span = span; 
    MapView.region = [MapView regionThatFits:region]; 

    for(MyClass *t in self.array){ 
     [MapView addAnnotation:t]; 
    } 
    [super viewDidLoad]; 
} 



//this is the required method implementation for MKMapView annotations 
- (MKAnnotationView *) mapView:(MKMapView *)thisMapView 
      viewForAnnotation:(MyClass *)annotation 
{ 


    static NSString *identifier = @"MyIdentifier"; 

    //the result of the call is being cast (MKPinAnnotationView *) to the correct 
    //view class or else the compiler complains 
    MKPinAnnotationView *annotationView = (MKPinAnnotationView *)[thisMapView 
                    dequeueReusableAnnotationViewWithIdentifier:identifier]; 
    if(annotationView == nil) 
    { 
     annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; 
    } 

    annotationView.pinColor = MKPinAnnotationColorGreen; 

    //pin drops when it first appears 
    annotationView.animatesDrop=TRUE; 

    //tapping the pin produces a gray box which shows title and subtitle 
    annotationView.canShowCallout = YES; 

    UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    annotationView.rightCalloutAccessoryView = infoButton; 


    return annotationView; 
} 

उत्तर

6

जब आप addAnnotation या addAnnotations फोन, मानचित्र दृश्य एनोटेशन की अपनी आंतरिक सूची के संदर्भ (रों) कहते हैं।

annotationsMKMapView की संपत्ति NSArray के रूप में यह आंतरिक सूची (जो कुछ भी हो सकती है) देता है।

मुझे प्रलेखन में किसी भी स्थान की जानकारी नहीं है, जहां यह कहता है कि annotations प्रॉपर्टी उसी क्रम में सरणी लौटाती है जिसमें आपने एनोटेशन जोड़े हैं। यदि आपके पास showsUserLocation चालू है, तो सरणी में भी एनोटेशन शामिल होगा हालांकि आपने इसे स्पष्ट रूप से नहीं जोड़ा है।

आपको annotations संपत्ति में वस्तुओं के क्रम पर निर्भर होने की आवश्यकता नहीं है और न ही आपको इस पर निर्भर होना चाहिए।

  • अपने array के बाद से बुला addAnnotations (बहुवचन) द्वारा वस्तुओं कि <MKAnnotation> लागू, इसके माध्यम से पाशन के बजाय, आप एक शॉट में सभी एनोटेशन जोड़ने कर सकते हैं और पास:

    बस कुछ कोड के बारे में सुझाव यह सरणी

  • viewForAnnotation में, आप जो भी गुण सेट कर रहे हैं, उनमें से कोई भी विशिष्ट एनोटेशन पर निर्भर नहीं है ताकि आप उन्हें if (av == nil) ब्लॉक के अंदर सेट कर सकें। इस तरह आप अधिकतम पुन: उपयोग करते हैं।
  • में if के बाद और बाहर, आपको वर्तमान एनोटेशन के लिए annotation दृश्य की संपत्ति सेट करनी चाहिए। यह किसी अन्य एनोटेशन से दृश्य का पुन: उपयोग किया जा रहा है।
  • अंत में, viewForAnnotation में, मान लें कि annotationMyClass प्रकार का होगा। यदि आप showsUserLocation चालू करते हैं, तो यह मामला नहीं होगा। पैरामीटर को id<MKAnnotation> के रूप में घोषित करना सुरक्षित है और फिर यदि आवश्यक हो तो इसकी कक्षा जांचें और फिर इसे कास्ट करें।
+0

अपने अंतिम बिंदु के लिए धन्यवाद। हमेशा –

1

@ अन्ना, आप बताते हैं कि आपको एनोटेशन के आदेश के लिए चिंतित नहीं होना चाहिए। यह मेरे मामले में सच नहीं है। कुछ एनोटेशनव्यू ओवरलैप हो सकते हैं, और मुझे हमेशा दो ओवरलैपिंग दृश्यों के शीर्ष पर होने के लिए एक विशिष्ट व्यक्ति की आवश्यकता होती है। तो ऑर्डर डीओ एनोटेशन के लिए समझ में आता है, क्योंकि मुझे उम्मीद है कि - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation उसी क्रम में कॉल किया जाता है क्योंकि मैंने एनोटेशन जोड़े हैं।

संपादित करें: and the solution is here :-)

+1

सीखना समाधान एनोटेशन के प्रदर्शन आदेश के बारे में है ** _ विचार _ ** (आईडी नहीं <एमकेएनोटेशन> ** _ मॉडल _ ** ऑब्जेक्ट्स जो ओपी का सवाल है)। इसके अतिरिक्त, viewForAnnotation प्रतिनिधि विधि _can_ को एक ही एनोटेशन के लिए कई बार बुलाया जा सकता है, इसके बाद _after_ इसे जोड़ा गया है (उदाहरण के लिए। यदि आप मानचित्र को स्क्रॉल/ज़ूम करते हैं और एनोटेशन स्क्रीन पर वापस आ जाता है)। आपकी धारणा एनोटेशन की एक छोटी संख्या या विशिष्ट ओएस संस्करण के साथ "काम" कर सकती है लेकिन आपको इसकी उम्मीद या भरोसा नहीं करना चाहिए। – Anna

+0

तो, अन्ना, एनोटेशन का जेड-ऑर्डर बिल्कुल कॉन्फ़िगर करने योग्य नहीं है? – wreckgar23

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