2012-04-26 14 views
10

मेरे पास एक नक्शा दृश्य है जिसे मैं में स्विच के आधार पर annotations जोड़ रहा हूं और हटा रहा हूं। जब मैं popover के बाहर स्पर्श करता हूं, तो यह सही ढंग से खारिज कर देता है और delegate विधि popoverControllerDidDismissPopover: पर कॉल करता है मेरी समस्या यह है कि जब मैं popover (पॉपओवर व्यू के भीतर स्पर्श करना) में स्विच टॉगल करता हूं, तो अगर मैं मानचित्र से annotations हटा रहा हूं सही तरीके से व्यवहार करता है और पॉपओवर दृश्यमान रहता है लेकिन यदि मैं मानचित्र दृश्य में annotations जोड़ रहा हूं, तो popover गायब हो जाता है और delegate विधि नहीं कहा जाता है। क्या कोई इस व्यवहार से पहले आया है?UIPopoverController बिना किसी प्रतिनिधि कॉल के खारिज कर देता है

स्विच के चालू और बंद कोड के बीच एकमात्र अंतर यह है कि कोई एक सरणी से annotations हटा देता है, जबकि दूसरा annotations जोड़ता है। मानचित्र दृश्य में annotations जोड़ते समय यह केवल एक समस्या है। कोई भी मदद या सुझाव सराहनीय होगा।

-(IBAction)toggleMapFiltersView:(id)sender 
{ 
    LayerPopoverViewController *popOverViewController = [[LayerPopoverViewController alloc] init]; 
    [popOverViewController setDelegate:self]; 
    [popOverViewController setBranchesShowing:branchesShowing]; 
    [popOverViewController setSchoolsShowing:schoolsShowing]; 

    [layersButton setSelected:YES]; 

    popoverController = [[UIPopoverController alloc] initWithContentViewController:popOverViewController]; 


    [popoverController setDelegate:self]; 
    [popOverViewController release]; 
    [popoverController presentPopoverFromRect:layersButton.frame 
             inView:[self view] 
        permittedArrowDirections:UIPopoverArrowDirectionAny 
            animated:YES]; 
} 

इस विधि कि पॉपओवर देखने से बुलाया जा रहा है:

यह कैसे popover प्रदर्शित किया जाता है

-(IBAction)toggleSchools:(id)sender 
{ 
    if ([self.delegate respondsToSelector:@selector(didChangeSchoolsDisplaySettingWithVisible:)]) 
    { 
     if ([schoolsSwitch isOn]) 
     { 
     [self.delegate didChangeSchoolsDisplaySettingWithVisible:YES]; 
      self.schoolsShowing = YES; 
     } 
     else 
     { 
      [self.delegate didChangeSchoolsDisplaySettingWithVisible:NO]; 
      self.schoolsShowing = NO; 
     } 
    } 
} 

और इस विधि में यह जिक्र है:

-(void)didChangeSchoolsDisplaySettingWithVisible:(BOOL)visible 
{ 
    if (visible == YES) 
    { 
     schoolsShowing = YES; 
     if (self.schoolArray != nil && [self.schoolArray count] > 0) 
     { 
      for (MySchool *school in self.schoolArray) 
      { 
       [mapView addAnnotation:school]; 
      } 
     } 
    } 
    else 
    { 
     schoolsShowing = NO; 
     for (id<MKAnnotation> annotation in mapView.annotations) 
     { 
      if ([annotation isKindOfClass:[MySchool class]]) 
      { 
       [mapView removeAnnotation:annotation]; 
      } 
     } 
    } 
} 
+0

आप कुछ कोड पोस्ट कर सकता मदद कर सकता है, तो हम क्या हो रहा है देख सकते हैं? – xCoder

+0

ने – user1359733

+0

शामिल दो विधियों को जोड़ा, कृपया हमें दिखाएं कि पॉपओवर कैसे स्थापित और प्रदर्शित किया गया है। –

उत्तर

0

पॉपओवर का उपयोग पहली जगह क्यों करें? कस्टम व्यू को नियंत्रित करना आपके लिए आसान होगा।

आप एक कस्टम पॉपअप व्यू बना सकते हैं, और इसे अपने इच्छित निर्देशांक से ऊपर रखें। पॉपअप में एक डिलीवरी बटन है, और इस कार्रवाई के लिए प्रतिनिधि कॉल करें।

यहां कुछ कोड है (इस उदाहरण में, निर्देशांक मार्कर से हैं, और mapView Google है)। आपको समन्वय को एक CGPoint में भी परिवर्तित करना होगा।

UIAnnotationView *annotation = [[UIAnnotationView alloc] initWithFrame:CGRectMake(0,0,100,100)]; 
        annotation.delegate = self; 
        annotation.tag = 101; 

CGPoint point = [mapView.projection pointForCoordinate:marker.position]; 
     annotation.origin = CGPointMake(point.x - annotation.width/2, point.y - annotation.height - MARKER_DEFAULT_SIZE); 
     [mapView addSubview:annotation]; 

UIAnnotaionView closeButtonClicked प्रतिनिधि:

- (void)annotationViewCloseButtonClicked:(UIAnnotationView *)annotationView 
{ 
    [[_mapView viewWithTag:101] removeFromSuperview]; 
} 

जब नक्शे में अन्य बिंदुओं को छू इस प्रतिनिधि को ओवरराइड popupView खारिज करने के लिए:

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate 
{ 
    [[_mapView viewWithTag:101] removeFromSuperview]; 
} 
+0

पॉपओवर * करते हैं * उनके पास एक तरह का सिस्टम-इश है। – Undo

+0

सच है, लेकिन यह एक वैध विकल्प है। प्लस, एक पॉपओवर-जैसी डिज़ाइन ढूंढना मुझे लगता है .. – Lirik

0

आप की कोशिश की एक और प्रतिनिधि विधि है

- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController { 
    // do some stuff here and decide whether to dismiss or not 
    return YES; //or No depending on your condition 
} 

यह आपको पूछेगा कि क्या आप पॉपओवर नियंत्रक को खारिज करना चाहते हैं या नहीं। प्रत्येक बार पॉपओवरव्यू कंट्रोलर

को बर्खास्त करने वाला है, अन्यथा आप मानचित्रदृश्य में एनोटेशन जोड़ने पर एक विधि कॉल कर सकते हैं। वैसे भी आप जानते हैं कि पॉप ओवर खारिज हो रहा है। पॉप ओवर कंट्रोलर को खारिज करते समय वही काम करें। आप

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController 

साथ क्या कर रहे हैं मुझे आशा है कि यह आप