2012-04-26 2 views
10

의 스위치를 기반으로 annotations을 추가 및 제거하는지도보기가 있습니다. popover 바깥 쪽을 터치하면 정확하게 닫히고 delegate 메서드를 호출합니다. popoverControllerDidDismissPopover: 내가 가지고있는 문제는 을지도에서 제거하면 popover (팝업 뷰 내에서 만지기)의 스위치를 토글 할 때 발생합니다. 올바르게 동작하고 popover는 계속 표시되지만 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

popover가 설정되고 표시되는 방법을 알려주십시오. –

답변

0

왜 처음부터 popovers를 사용합니까? customView를보다 쉽게 ​​제어 할 수 있습니다.

맞춤형 팝업 뷰를 만들어 원하는 좌표 바로 위에 배치 할 수 있습니다. 팝업에는 해제 버튼이 있으며이 작업에 대한 대리자 호출이 있습니다.

여기에 몇 가지 코드가 있습니다 (이 예에서는 좌표가 마커에서 나오며 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

Popovers * do *에는 일종의 시스템 느낌이 있습니다. – Undo

+0

사실이지만 올바른 대안입니다. 더하기, popover-like 디자인을 찾는 것은 아마 나는 추측한다. .. – 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 
} 

popOver 컨트롤러를 닫을 지 여부를 묻습니다. popoverviewcontroller가 해제 될 때마다 호출됩니다.

그렇지 않으면 mapview에 주석을 추가 할 때 메소드를 호출 할 수 있습니다. 어쨌든 당신은 팝 오버가 없어지는 것을 압니다. 팝 오버 컨트롤러가 해제 될 때도 동일한 작업을 수행하십시오. 당신이

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController 

로 수행하는 것처럼 나는 이것이 당신이