2011-06-16 10 views
10

मैं एक बिंदु पर अपने मानचित्र के सभी ओवरले को हटाना चाहता हूं, और मैंने विभिन्न तरीकों की कोशिश की लेकिन यह कभी काम नहीं करता है।आईओएस को हटाने के लिए एमकेमैप व्यू ओवरले

अंतिम प्रयास मैंने [self.mapView removeOverlays:self.mapView.overlays]; किया और यह अभी भी काम नहीं करता है। कोई विचार है कि मैं उन ओवरले को कैसे हटा सकता हूं?

धन्यवाद।

UPDATE 1

मैं त्रुटि है: malloc: *** error for object 0x5adc0c0: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug

मुझे लगता है कि मैं जानता हूँ कि क्यों, लेकिन वास्तव में यह कैसे तय करने के लिए नहीं पता ... यहाँ कोड है जब मैं करने की जरूरत है मेरी MapView पर एक और रेखा खींचना:

// Create a c array of points. 
MKMapPoint *pointsArray = malloc(sizeof(CLLocationCoordinate2D) * 2); 

// Create 2 points. 
MKMapPoint startPoint = MKMapPointForCoordinate(CLLocationCoordinate2DMake(oldLatitude, oldLongitude)); 
MKMapPoint endPoint = MKMapPointForCoordinate(CLLocationCoordinate2DMake(newLatitude, newLongitude)); 

// Fill the array. 
pointsArray[0] = startPoint; 
pointsArray[1] = endPoint; 

// Erase polyline and polyline view if not nil. 
if (self.routeLine != nil) { 
    [_routeLine release]; 
    self.routeLine = nil; 
} 

if (self.routeLineView != nil) { 
    [_routeLineView release]; 
    self.routeLineView = nil; 
} 

// Create the polyline based on the array of points. 
self.routeLine = [MKPolyline polylineWithPoints:pointsArray count:2]; 

// Add overlay to map. 
[self.mapView addOverlay:self.routeLine]; 

// clear the memory allocated earlier for the points. 
free(pointsArray); 

// Save old coordinates. 
oldLatitude = newLatitude; 
oldLongitude = newLongitude; 

तो मैं routeLine वस्तु जो पिछले ओवरले है जारी। तो जब मैंने इसे हटाने की कोशिश की, तो यह दुर्घटनाग्रस्त हो गया क्योंकि इसे पहले से ही हटा दिया गया है।

यहाँ ओवरले विचारों को जोड़ने के लिए MapView प्रतिनिधि के लिए कोड है:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay 
{ 
    MKOverlayView* overlayView = nil; 

    if(overlay == _routeLine) { 
     // If we have not yet created an overlay view for this overlay, create it now. 
     if(self.routeLineView == nil) { 
      self.routeLineView = [[[MKPolylineView alloc] initWithPolyline:_routeLine] autorelease]; 

      self.routeLineView.fillColor = [UIColor blueColor]; 
      self.routeLineView.strokeColor = [UIColor blueColor]; 

      // Size of the trace. 
      self.routeLineView.lineWidth = routeLineWidth; 
     } 

     overlayView = self.routeLineView; 
    } 

    return overlayView; 
} 

तुम लोग जानते हैं कि कैसे मैं अपने MKMapView से सभी ओवरले को दूर करने के लिए इस मुद्दे को ठीक कर सकते हैं, अगर यह भयानक होगा!

अद्यतन 2

मैं अपने routeLine और routeLineView वस्तुओं को रिहा नहीं की कोशिश की है और अब यह काम करता है। ऐसा लगता है कि कोई रिसाव भी नहीं है।

// Erase polyline and polyline view if not nil. 
if (self.routeLine != nil) { 
    //[_routeLine release]; 
    self.routeLine = nil; 
} 

if (self.routeLineView != nil) { 
    //[_routeLineView release]; 
    self.routeLineView = nil; 
} 

उत्तर

10

जब आप removeOverlays: फोन, मानचित्र दृश्य जारी करेंगे MKOverlay और MKOverlayView ऑब्जेक्ट्स।

आप _routeLine और _routeLineView में इनके लिए अपना संदर्भ रखते हैं।

removeOverlays: के बाद कहा जाता है, तो आपके चर पहले से रिलीज़ मेमोरी को इंगित करेंगे। जब आप पॉलीलाइन को फिर से बनाते हैं, तो आप अधिक रिलीज़ होते हैं जिसके परिणामस्वरूप क्रैश होता है।

तो release कॉल निकालने:

if (_routeLine != nil) { 
    [_routeLine release]; // <-- remove this 
    self.routeLine = nil; 
} 

if (_routeLineView != nil) { 
    [_routeLineView release]; // <-- remove this 
    self.routeLineView = nil; 
} 
+0

मैंने यही किया :) बहुत बहुत धन्यवाद @ एना करेनीना! – Dachmt

7

जब आप डीबगर में कोड के माध्यम से कदम, जहां त्रुटि दिखाई देती है: तो अब मैं यह कर रहा हूँ?

एक विचार, आपको self.routeLine और self.routeLineView के लिए अपने रखरखाव/रिलीज चक्र के साथ कोई समस्या हो सकती है। मान लिया जाये कि वे एक retain विशेषता के साथ गुण हैं, जब आप कर

self.routeLine = [MKPolyline polylineWithPoints:pointsArray count:2]; 

अपने संश्लेषित एक्सेसर नई MKPolyline वस्तु को बनाए रखना है। उस ऑब्जेक्ट में बनाए गए सुविधा विधि से एक रखरखाव/ऑटोरेलीज जोड़ी भी होगी। इस विधि फिर से बुलाया जाए और आप

if (self.routeLine != nil) { 
    [_routeLine release]; 
    self.routeLine = nil; 
} 

कोड फोन है, तो आप दो बार चर रिहा खत्म हो जाएगा, स्पष्ट [_routeLine release] कॉल के साथ पहली और self.routeLine = nil; कॉल पर संश्लेषित एक्सेसर के साथ दूसरे। यह स्मृति में रहेगा, लेकिन जब आपका ऑटोरेलीज पूल निकाला जाता है तो ऐप को क्रैश कर देगा।

ज्यादातर मामलों में, पर सभी ओवरले स्पष्ट करने के लिए एक MKMapView (इस नमूने में mapView नाम) है, मैं की तरह निम्नलिखित कुछ करना चाहते हैं:

for (id<MKOverlay> overlayToRemove in mapView.overlays) 
{ 
    if ([overlayToRemove isKindOfClass:[OverlayClassToRemove class]]) 
    { 
     [mapView removeOverlay:overlayToRemove]; 
    } 
} 
+1

'polylineWithPoints: गिनती:' विधि MKMapPoint structs की एक सी सरणी लेता है। – Anna

+0

मुझे आपके द्वारा बताए गए ओवरले को हटाने का तरीका पसंद है, और सोचा कि यह काम करेगा, या कम से कम ऐप को क्रैश नहीं करेगा। लेकिन ऐसा किया और मुझे एक ही त्रुटि है। @ अन्ना करेनिना जिस तरह से मैं अंक संग्रहीत करता हूं वह सही है? मैंने 'NSArray' में स्टोर करने की कोशिश की और वैसे भी इस प्रकार की ऑब्जेक्ट को भी इसमें शामिल नहीं कर सकता। – Dachmt

+0

@ डचमेट और @ अन्ना करेनीना मैं सही खड़ा हूं। यही वह चीज है जो मुझे लगता है कि मैंने खुद को नहीं किया है। मैं अपना जवाब संपादित करूंगा। – Kongress

0

स्विफ्ट 3 extenstion

extension MKMapView 
{ 
    func removeAllOverlay(){ 
     for overlay:MKOverlay in self.overlays { 
      self.remove(overlay) 
     } 
    } 

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