2012-04-26 23 views
10

Tengo una vista de mapa que estoy agregando y eliminando annotations basado en un interruptor en un popovercontroller. Cuando toco fuera del popover, se cierra correctamente y llama al delegate método popoverControllerDidDismissPopover: El problema que tengo es que cuando activo el interruptor en el popover (tocando dentro de la vista de popover), si elimino el annotations del mapa, se comporta correctamente y el popover permanece visible pero si agrego el annotations a la vista de mapa, entonces el popover desaparece y no se llama al método delegate. ¿Alguien ha encontrado este comportamiento antes?UIPopoverController descarta sin llamada de delegado

La única diferencia entre el código de encendido y apagado del interruptor es que uno elimina el annotations de un conjunto, mientras que el otro agrega el annotations. Esto es solo un problema cuando se agrega annotations a la vista del mapa. Cualquier ayuda o sugerencias serán apreciadas.

Esta es la forma en que se muestre lo 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]; 
} 

Este es el método que se está llamando desde el punto de vista 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; 
     } 
    } 
} 

y este es el método que se está refiriendo a:

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

¿podría enviar algo de código, para que podamos ver lo que está sucediendo? – xCoder

+0

agregó los dos métodos implicados – user1359733

+0

Por favor, muéstrenos cómo se configura y muestra el popover. –

Respuesta

0

¿Por qué utilizar los popovers en primer lugar? será más fácil para usted controlar una vista personalizada.

Puede crear una vista emergente personalizada y colocarla justo encima de las coordenadas que desee. la ventana emergente tiene un botón de descartar y delegar la llamada para esta acción.

Aquí hay un código (en este ejemplo, las coordenadas son de un marcador, y mapView es de Google). También deberá convertir las coordenadas a un 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 Delegado:

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

Para descartar la popupView al tocar otros puntos en el mapa anular este delegado:

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

Popovers * do * tienen una especie de sensación de sistema-ish para ellos. – Undo

+0

Es cierto, pero es una alternativa válida. plus, encontrar un diseño tipo popover es fácil, supongo ... – Lirik

0

Ha intentado un método más delegado

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

Le preguntará si desea cerrar el controlador de popOver o no. Se llama cada vez que popoverviewcontroller está a punto de cerrar

De lo contrario, puede llamar a un método al agregar una anotación a mapview. De todos modos, sabes que el estallido se está descartando. Haga el mismo trabajo cuando el controlador pop-over se cierre. Como lo están haciendo con

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController 

espero que esto podría ayudarle a

Cuestiones relacionadas