UIPopoverController在没有委托调用的情况下解散

use*_*733 10 iphone mkmapview uipopovercontroller ios

我有一个地图视图,我annotations根据一个开关添加和删​​除popovercontroller.当我在外面触摸时popover,它正确地解散并调用delegate方法popoverControllerDidDismissPopover: 我遇到的问题是当我切换popover(在弹出视图中触摸)中的开关时,如果我annotations从地图中移除它的行为正确并且弹出保持可见但如果我将其添加annotations到地图视图,则popover消失并且delegate不调用该方法.有没有人遇到过这种行为?

交换机的on和off代码之间的唯一区别是,一个annotations从数组中删除,而另一个添加annotations.添加annotations到地图视图时,这只是一个问题.任何帮助或建议将不胜感激.

popover是显示的方式:

-(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];
}
Run Code Online (Sandbox Code Playgroud)

这是从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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是它所指的方法:

-(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];
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Lir*_*rik 0

为什么首先使用弹出窗口?您将更容易控制自定义视图。

您可以创建一个自定义 popupView,并将其放置在您喜欢的坐标上方。弹出窗口有一个关闭按钮,并委托调用此操作。

这是一些代码(在这个例子中,坐标来自标记,mapView 是谷歌的)。您还必须将坐标转换为 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];
Run Code Online (Sandbox Code Playgroud)

UIAnnotationView closeButtonClicked 委托:

- (void)annotationViewCloseButtonClicked:(UIAnnotationView *)annotationView
{
    [[_mapView viewWithTag:101] removeFromSuperview];
}
Run Code Online (Sandbox Code Playgroud)

要在触摸地图中的其他点时关闭 popupView,请覆盖此委托:

- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate
{
    [[_mapView viewWithTag:101] removeFromSuperview];
}
Run Code Online (Sandbox Code Playgroud)