2011-09-07 10 views
9

मेरे पास केवल एक एनोटेशन वाला नक्शा है। मैंने एक साधारण वर्ग बनाया है जिसे मैं एनोटेशन पर क्लिक करते समय दिखाना चाहता हूं। समस्या यह है कि जब मैं एनोटेशन पर क्लिक करता हूं हो जाता।नक्शा एनोटेशन पर क्लिक किए जाने पर एक और दृश्य दिखाएं

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

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark{ 
    NSLog(@"Reverse Geocoder completed"); 
    mPlacemark=placemark; 
    [mapView addAnnotation:placemark]; 
} 

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{ 
    MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentloc"]; 
    annView.animatesDrop=TRUE; 

    //create UIButton for annotation 
    UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    //NSInteger annotationValue = [self.annotations indexOfObject:annotation]; 

    [detailButton addTarget:self action:@selector(showDetailView:) forControlEvents:UIControlEventTouchUpInside]; 
    annView.rightCalloutAccessoryView=detailButton; 
    return annView; 
} 


-(void)showDetailView:(id)sender{ 
    NSLog("inside the stupid method"); 
    MyDetailViewController *detailView=[[MyDetailViewController alloc] initWithNibName:@"MyDetailViewController" bundle:nil]; 
    [[self navigationController] pushViewController:detailView animated:YES]; 
    [detailView release]; 
} 

मेरे showDetailView समारोह मदद करना.मैं iphone के लिए नए कभी नहीं called.Please हो जाता है और मैं एक साधारण thing.Thanks

फिर भी भूल भी सकते हैं काम नहीं कर रहा! !!!

उत्तर

16

पहले, जांचें कि मानचित्र दृश्य के delegate अन्यथा अपने viewForAnnotation विधि कहा जाता है नहीं किया जाएगा निर्धारित है।

इसके बाद, सहायक बटन टिप्पणियों का कॉलआउट पर दिखाई देता है अगर आप canShowCallout सेट जो केवल दिखाई देगा:

annView.canShowCallout = YES; 

इसके बाद, बजाय बटन कार्रवाई को संभालने के लिए अपनी खुद की विधि का उपयोग कर के, यह बहुत बेहतर है मानचित्र दृश्य के अपने calloutAccessoryControlTapped प्रतिनिधि विधि है जो जब एक सहायक दोहन कहा जाता हो जाता है का उपयोग करें:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
    NSLog(@"inside the stupid method"); 

    //Here, the annotation tapped can be accessed using view.annotation 
} 

से [detailButton addTarget... लाइन निकालें।

शो में भी अपने NSLog को ध्यान दें, DDViewView विधि में अग्रणी @ है जो विधि को कॉल करने पर क्रैश हो जाएगा।

एक और बात यह है कि आपको dequeueReusableAnnotationViewWithIdentifierviewForAnnotation में एनोटेशन व्यू पुन: उपयोग को सक्षम करने के लिए उपयोग करना चाहिए।


उदाहरण अनुरोध किया:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation 
{ 
    static NSString *annReuseId = @"currentloc"; 

    MKPinAnnotationView *annView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:annReuseId]; 
    if (annView == nil) 
    { 
     annView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annReuseId]; 

     annView.animatesDrop = YES; 
     annView.canShowCallout = YES; 

     UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     annView.rightCalloutAccessoryView=detailButton; 
    } 
    else { 
     annView.annotation = annotation; 
    } 

    return annView; 
} 

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
    NSLog(@"calloutAccessoryControlTapped: annotation = %@", view.annotation); 
    MyDetailViewController *detailView=[[MyDetailViewController alloc] initWithNibName:@"MyDetailViewController" bundle:nil]; 
    //here, can set annotation info in some property of detailView 
    [[self navigationController] pushViewController:detailView animated:YES]; 
    [detailView release]; 
} 
+0

आप जो कह रहे हैं वह महान है लेकिन क्या आप एक पूर्ण कोड पोस्ट कर सकते हैं? – adrian

+0

मैं एक समान समस्या में भागता हूं, एनएसएलओजी स्ट्रिंग दिखाता है, इसलिए 'callOutAccessoryControlTapped' विधि को कॉल किया जाता है, लेकिन कुछ भी नहीं हुआ है, विस्तृत दृश्य नहीं दिखाया गया है, मैं स्टोरीबोर्ड के साथ काम करता हूं – Malloc

+0

@Malek, मैंने अभी तक स्टोरीबोर्ड का उपयोग नहीं किया है इसलिए विशिष्ट सलाह नहीं दे सकते हैं। आपको एक नए प्रश्न के रूप में पूछना चाहिए। यदि आप अपने नवीनतम प्रश्न का जिक्र कर रहे हैं, तो आपको इसे अपडेट करना चाहिए और उल्लेख करना चाहिए कि आप स्टोरीबोर्ड का उपयोग कर रहे हैं। – Anna

0

इस तरह अपने कार्य लिखें:

-(IBAction)showDetailView:(id)sender{ 
    NSLog("inside the stupid method"); 
    MyDetailViewController *detailView=[[MyDetailViewController alloc] initWithNibName:@"MyDetailViewController" bundle:nil]; 
    [[self navigationController] pushViewController:detailView animated:YES]; 
    [detailView release]; 
} 
+0

अभी भी काम नहीं कर रहा है !!! – adrian

0

निम्नलिखित के साथ -(IBAction)showDetailView:(UIView*)sender बदलें ...

-(void)showDetailView:(id)sender 
+0

अभी भी काम नहीं कर रहा है! – adrian

0

आप इस तरह आत्म करने के लिए नक्शा प्रतिनिधि सेट करने के लिए,

mapview.delegate=self; (अपने एक ही पृष्ठ में विधि बुला अगर)

यदि आप अपने कोड में प्रतिनिधि को असाइन नहीं करते हैं तो संबंधित विधियों को नहीं बुलाया जाएगा, इसलिए जांच करें कि क्या आपके ऊपर उल्लिखित रेखा है या नहीं।

2

ठीक है।

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
    NSLog(@"calloutAccessoryControlTapped: annotation = %@", view.annotation); 
    MyDetailViewController *detailView=[[MyDetailViewController alloc] initWithNibName:@"MyDetailViewController" bundle:nil]; 
    //here, can set annotation info in some property of detailView 
    [[self navigationController] pushViewController:detailView animated:YES]; 
    [detailView release]; 
} 

उपयोग बजाय निम्नलिखित कोड: आप स्टोरीबोर्ड का उपयोग कर रहे हैं, तो आप मानचित्र दृश्य नियंत्रक और उसके बाद जहां नीचे कोड मौजूद है के बीच एक segue बनाने की जरूरत

NSLog(@"calloutAccessoryControlTapped: annotation = %@", view.annotation); 
[self performSegueWithIdentifier:@"DetailViewController" sender:self]; 

यह आपको दे देंगे विस्तृत दृश्य के लिए आंदोलन।

+0

आपका कोड मेरे लिए सही काम करता है! धन्यवाद ! – Shinichi

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