2012-04-13 9 views
5

मै मैप्यूव्यू पर कई एनोटेशन (लगभग 500) जोड़ना चाहता हूं लेकिन अधिकतम दिखने वाला लगता है 100. यदि मैं 100 से अधिक, व्यूफोरऑनोटेशन प्रतिनिधि विधि नहीं कहा जाता है। लेकिन यह नीचे 100एनकेशनव्यू की अधिकतम संख्या (एमकेएएनोटेशन) जिसे एमकेमैप व्यू पर खींचा जा सकता है?

यहाँ एनोटेशन के लिए पूरी तरह से काम करता है कोड है: (काम करता है केवल जब की annotationArray सरणी गिनती 101 से भी कम है)

_allPoints = [[NSMutableArray alloc] init]; 

NSString* responseFile = [[NSBundle mainBundle] pathForResource:@"Datafile" ofType:@"txt"]; 
NSData *sampleData = [NSData dataWithContentsOfFile:responseFile]; 
if (sampleData) { 
    NSError* error; 
    NSDictionary* json = [NSJSONSerialization 
          JSONObjectWithData:sampleData 

          options:kNilOptions 
          error:&error]; 

    NSArray* response = [json objectForKey:@"response"]; 
    for (NSDictionary *lineDict in response) { 
     if ([[lineDict objectForKey:@"data"] isKindOfClass:[NSArray class]]) { 
      SinglePoint *singlePoint = [[SinglePoint alloc] initWithDictionary:lineDict]; 
      [_allPoints addObject:singlePoint]; 
     } 
     else { 
      NSLog(@"Error"); 
     } 
    } 
} 


_mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
[_mapView setDelegate:self]; 
[self.view addSubview:_mapView]; 

NSMutableArray *annotationArray = [[NSMutableArray alloc] init]; 
for (int i=0; i<[_allPoints count]; i++) { 
    SinglePoint *singlePoint = [_allPoints objectAtIndex:i]; 
    NVPolylineAnnotation *annotation = [[NVPolylineAnnotation alloc] initWithPoint:singlePoint mapView:_mapView]; 
    [annotationArray addObject:annotation]; 
} 
[_mapView addAnnotations:(NSArray *)annotationArray]; 

CLLocationCoordinate2D centerCoord = { 28.632747, 77.219982 }; 
[_mapView setCenterCoordinate:centerCoord zoomLevel:12 animated:NO]; 

प्रतिनिधि विधि है:

संपादित करें: टिप्पणियों के अनुसार, दृश्य का पुन: उपयोग करना शुरू किया लेकिन बिना किस्मत के :(

if ([annotation isKindOfClass:[NVPolylineAnnotation class]]) { 
    static NSString *viewIdentifier = @"annotationView"; 
    NVPolylineAnnotationView *annotationView = (NVPolylineAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:viewIdentifier]; 
    if (annotationView == nil) { 
     annotationView = [[NVPolylineAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:viewIdentifier mapView:_mapView]; 
    } 
    return annotationView; 
} 
return nil; 

मुझे प्रलेखन या कहीं और में कोई प्रतिबंध नहीं मिला। क्या यह स्मृति समस्या हो सकती है?

+1

क्या अगर आप अपने 'annotationArray' को' allPoints' 500 बार में पहली वस्तु जोड़ना होता है? –

+0

क्या 'NVPolylineAnotation' के लिए स्रोत कोड प्रदान करना संभव है? –

उत्तर

0

अंततः समस्या को ट्रैक करने में सक्षम था। मानचित्र के केंद्र को सेट करके इसे हल करें और फिर बाद में एनोटेशन जोड़ना। मुझे अभी भी पता नहीं क्यों 100 एनोटेशन पहले दिखाए गए थे (और केवल 100 क्यों नहीं)। इस पर आपके सुझाव और समय के लिए सभी का धन्यवाद।

इस कोड को मैं बदल है: -

_mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
[_mapView setDelegate:self]; 
[self.view addSubview:_mapView]; 

CLLocationCoordinate2D centerCoord = { 28.632747, 77.219982 }; 
[_mapView setCenterCoordinate:centerCoord zoomLevel:12 animated:NO]; 

NSMutableArray *annotationArray = [[NSMutableArray alloc] init]; 
for (int i=0; i<[_allPoints count]; i++) { 
    SinglePoint *singlePoint = [_allPoints objectAtIndex:i]; 
    NVPolylineAnnotation *annotation = [[NVPolylineAnnotation alloc] initWithPoint:singlePoint mapView:_mapView]; 
    [annotationArray addObject:annotation]; 
} 
[_mapView addAnnotations:(NSArray *)annotationArray]; 
+0

क्या सभी एनोटेशन पॉइंट्स को बाध्य करने वाले 'एमके कॉर्डिनेट रीजन' का निर्माण करके हार्डकोडेड अक्षांश और देशांतर से बचना संभव होगा, और फिर [setRegion: एनिमेटेड:] (http://developer.apple.com/library/ios/# प्रलेखन/मैपकिट/संदर्भ/एमकेएपीवीव_C ग्लास/एमकेमैप व्यू/एमकेमैपव्यू.html # // apple_ref/occ/instm/MKMapView/setRegion: एनिमेटेड :) मानचित्र को किसी भी स्थिति पर रखने के लिए और इसे ज़ूम करने की आवश्यकता है? (यदि कोई अंक नहीं है तो फॉलबैक करें, या आप अपवाद को ट्रिगर करेंगे।) – Dondragmer

+0

उत्तर देने के लिए धन्यवाद .. –

1

MKMapViewannotationViews के लिए सीमा नहीं है। लेकिन यह कुछ निश्चित विचारों (+1000) से काफी लापरवाही और अनुपयोगी हो जाता है।

मेरा मानना ​​है कि इसका कारण यह है कि आप annotationView प्रबंधन को पूरी तरह से गलत तरीके से संभालते हैं। यदि आप एआरसी का उपयोग कर रहे हैं, तो भी आपको प्रत्येक एनोटेशन के लिए एक अद्वितीय दृश्य नहीं बनाना चाहिए। आपको UITableView के सेल की तरह प्रत्येक अप्रयुक्त दृश्य का पुन: उपयोग करना चाहिए।

इस के लिए Introduction to MapKit on iOS - Ray Wenderlich जैसे कुछ अच्छे ट्यूटोरियल हैं।

यदि यह आपकी समस्या का समाधान नहीं करेगा, तो आपको अपनी एनोटेशन कक्षाओं को डीबग करने का प्रयास करना चाहिए। (NVPolylineAnnotation और NVPolylineAnnotationView)। शायद कुछ गड़बड़ है। क्या आपने बराबर निर्देशांक के लिए अपने अंक सरणी की भी जांच की थी?

+1

धन्यवाद @yinkou .. 1) मुझे नहीं लगता कि यह मुद्दा स्मृति प्रबंधन के साथ है क्योंकि यह 101 विचारों के ठीक बाद होता है। 2) मैंने बराबर समन्वय के लिए अंक की जांच की लेकिन कोई भी नहीं है। यहां तक ​​कि यदि कुछ बिंदु समान हैं, तो मुझे शेष 100 अंक आकर्षित करना चाहिए जिन्हें मैं – Shri

+0

देख सकता हूं, आप सही हैं, फिर भी आपको एनोटेशन व्यू का पुन: उपयोग करना चाहिए क्योंकि यह अनुशंसित पैटर्न है। क्या आप वह कोड पोस्ट कर सकते हैं जहां आप अपना _allPoints सरणी बनाते हैं और पॉप्युलेट करते हैं? – yinkou

+1

मैंने प्रश्न अपडेट किया है .. – Shri

0

आप जितनी चाहें उतनी एनोटेशन जोड़ सकते हैं। हालांकि, प्रत्येक एनोटेशन के विचार तब तक नहीं बनाए जाएंगे जब तक कि एनोटेशन की coordinate संपत्ति आपके मानचित्र दृश्य के दृश्य भाग के साथ छेड़छाड़ न करे। MapKit केवल एक दृश्य नहीं बनाएगा क्योंकि आपने मानचित्र पर एक टिप्पणी जोड़ा है।

+0

इस मामले में, यह केवल तभी आकर्षित नहीं होता जब विचार संख्या 100 से ऊपर हो। यदि मैं 101 विचारों की आपूर्ति करता हूं, तो पहले 100 विचार अभी भी पहले के विचार हैं जो दिखाए जा रहे थे और दृश्यमान भाग में। लेकिन जैसे ही 101 विचारों पर जाएं, कुछ भी नहीं दिखाया गया है। यहां तक ​​कि प्रतिनिधि को भी बुलाया नहीं जाता है। – Shri

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