UIPopoverController увольняет без участия делегата

У меня есть вид карты, который я добавляю и удаляю annotations с помощью переключателя в popovercontroller. Когда я прикасаюсь за пределами popover, он корректно отклоняется и вызывает метод delegate popoverControllerDidDismissPopover:. Проблема, с которой я столкнулась, заключается в том, что когда я переключаю переключатель в popover (касаясь в представлении popover), если я я удаляю annotations с карты, которая ведет себя корректно, а popover остается видимым, но если я добавляю annotations к представлению карты, то popover исчезает, а метод delegate не вызывается. Кто-нибудь сталкивался с этим поведением раньше?

Единственное различие между кодом включения и выключения коммутатора заключается в том, что вы удаляете 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];
}

Это метод, который вызывается из представления 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];
            }
        }
    }
}

Ответ 1

Зачем использовать popovers в первую очередь? вам будет легче управлять пользовательским интерфейсом.

Вы можете создать собственное popupView и поместить его чуть выше нужных вам координат. всплывающее окно имеет кнопку увольнения и делегирует вызов для этого действия.

Здесь некоторый код (в этом примере координаты от маркера, а 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 Delegate:

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

Чтобы отклонить popupView при касании других точек на карте, переопределите этот делегат:

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

Ответ 2

Вы пробовали еще один метод делегата

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

Надеюсь, это поможет вам.