2012-04-26 19 views
10

のスイッチに基づいてannotationsを追加して削除するマップビューがあります。 popoverの外側に触れると正しく閉じられ、メソッドが呼び出されますpopoverControllerDidDismissPopover:私は、をマップから削除している場合に、popoverのスイッチを切り替えると(ポップオーバービュー内でタッチする)正しく動作し、ポップオーバーは表示されたままになりますが、annotationsをマップビューに追加すると、popoverが表示されなくなり、delegateメソッドが呼び出されません。誰もこの行動を前にして来たのですか?UIPopoverControllerは、代理人の呼び出しなしで閉じる

スイッチのオンとオフコードの唯一の違いは、アレイからannotationsを削除し、もう1つは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

に2つのメソッドが追加されました – user1359733

+0

popoverがどのように設定されて表示されるかを教えてください。 –

答えて

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

Popovers * do *は一種のシステム感覚を持っています。 – Undo

+0

真ですが、有効な代替手段です。 さらに、ポップオーバーのようなデザインを見つけるのは簡単だと思います。 – Lirik

0

を使用すると、1つのより多くのデリゲートメソッドを試してみましたが

- (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 

でやっているように私はこれがあなた