Tengo un MKMapView (también un UIPopoverControllerDelegate) con Anotaciones. Este MapView, en el MKTestMapView.h archivo, un UIPopoverController* popoverController definido en el @interfaz y un @property (nonatomic, retain) UIPopoverController* popoverController; definido fuera de la @interface sección. Este controlador es @synthesized en el MKTestMapView.m archivo y está publicado en la - (void)dealloc sección. Las Anotaciones en este MapView han rightCalloutAccessoryViewdefinido de la siguiente:

- (void)mapView:(MKMapView *)mapView2 annotationView:(MKAnnotationView *)aview calloutAccessoryControlTapped:(UIControl *)control{

...

CGPoint leftTopPoint = [mapView2 convertCoordinate:aview.annotation.coordinate toPointToView:mapView2];

int boxDY=leftTopPoint.y;
int boxDX=leftTopPoint.x;
NSLog(@"\nDX:%d,DY:%d\n",boxDX,boxDY);

popoverController = [[UIPopoverController alloc] initWithContentViewController:controller];
popoverController.delegate = self;
CGSize maximumLabelSize = CGSizeMake(320.0f,600.0f);

popoverController.popoverContentSize = maximumLabelSize;

CGRect rect = CGRectMake(boxDX, boxDY, 320.0f, 600.0f);

[popoverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];


...

}

Ahora aquí viene la parte divertida. Primero de todo, no estoy seguro si necesito maximumLabelSize y la rect a ser del mismo tamaño. Soy nuevo en el popovercontroller así que yo estoy jugando este por el oído..

Bien, la ventana emergente se muestra. Ahora a despedir de ella. Puede hacer clic en cualquier lugar en mapView2 y la ventana emergente se va…pero necesito que el usuario haga clic en un botón en la vista si se cambia nada. URGH!

Los documentos muestran:

Para descartar una ventana emergente mediante programación,
llame a la dismissPopoverAnimated:
método de la ventana emergente controlador.

Bien, aquí está el problema: Por definición de cómo el popoverController obras, haciendo clic dentro de el punto de vista de la muestra ventana emergente (haga clic en el botón), pero tienen que activar la dismissPopoverAnimated: método del controlador que lanzado esta ventana emergente vista, en mi caso, la popoverController dentro de la MKTestMapView.m archivo.

Ahora, habiendo dicho todo esto, recordar, [popoverController release] no sucede hasta:

- (void)dealloc {
 [popoverController release];
 [mapView release];
    [super dealloc];
}

Así, no me acaba de hacer el siguiente dentro del botón (desordenado, pero puede funcionar):

(Suponiendo que mi ventana emergente punto de vista es un formato tableview) En el:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
MKTestMapView * mKTestMapView = [[MKTestMapView alloc] init];
[[mKTestMapView popoverController].dismissPopoverAnimated:YES];
}

Aquí está mi problema: no puedo averiguar si hace el de arriba me da un reference (si es que existe tal cosa) a la existente ver que en la pantalla-y por lo tanto el punto de vista de que es el dueño de ese popoverController. Si es tan simple como

[[[self parentView] popoverController].dismissPopoverAnimated:YES];

Voy a disparar a mí mismo porque yo no creo que es la sintaxis correcta!

Esto debería ser fácil…sin embargo, estoy perdido. (probablemente sólo frustrado con tantas iPad diferencias que estoy aprendiendo).

¿Alguien puede explicar más?

OriginalEl autor Jann | 2010-04-14

2 Comentarios

  1. 18

    Tuve el mismo problema… yo tenía una cuidada botón «cerrar» (X) en la parte superior de mi punto de vista cargado por la ventana emergente, pero no funcionó. En mi aplicación universal será presentado como un nuevo punto de vista, de modo que el código debe estar.

    Lo que hice ahora fue que he añadido lo siguiente a mi detailedPinView (la vista en la ventana emergente cargas):

    en el detailedPinView.h archivo:

    @interface detailedPinView : UIViewController {
        [...]   
        UIPopoverController *popover;
        [...]
    }
    
    -(void)setPopover:(UIPopoverController*)aPopover;

    En el detailedPinView.m de archivo:

    - (void)setPopover:(UIPopoverController*)aPopover
    {
        popover = aPopover;
    }

    El botón X se cierra la vista mediante un IBAction, esto es lo que hacía allí:

    En el detailedPinView.m de archivo:

    -(IBAction)releaseDetailedView:(UIButton *)sender
    {
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        {
            if (popover != nil)
            {
                [popover dismissPopoverAnimated:YES];
            }
            else {
                NSLog(@"Nothing to dismiss");
            }
        }
        else{
            [self.parentViewController dismissModalViewControllerAnimated: YES];
        }
    }

    En la clase de cargar el mapa y la ventana emergente ver he añadido el siguiente código:

    [...]
    -(void)mapView:(MKMapView *)theMapView annotationView:(MKAnnotationView *)pin calloutAccessoryControlTapped:(UIControl *)control
    {   
        UIViewController *detailController = [[detailedPinView alloc] initWithNibName:@"detailedPinView" 
                                                                               bundle:nil 
                                                                       annotationView:pin];
    
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        {
    
            UIPopoverController* aPopover = [[UIPopoverController alloc] initWithContentViewController:detailController];
            [aPopover setDelegate:self];
            [aPopover setPopoverContentSize:CGSizeMake(320, 320) animated:YES];
    
            [detailController setPopover:aPopover];
            [detailController release];
    
            [mapView deselectAnnotation:pin.annotation animated:YES];
    
            self.popoverController = aPopover;
    
            [mapView setCenterCoordinate:pin.annotation.coordinate animated:YES];
    
            [self.popoverController presentPopoverFromRect:CGRectMake(382,498,0,0) inView:self.view  permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
        }
        else
        {
            [self presentModalViewController: detailController animated:YES];
        }
    
    
        [detailController release];
    }
    [...]

    No sé si era la respuesta que esperaba, yo creo que puede ser un poco desordenado manera de hacerlo… pero dando a la hora de programar este trabajó como un encanto 🙂

    Tanto como odio a este: si (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) porque no se puede utilizar en una Aplicación Universal o en un pre-3.2 aplicación, voy a marcar esto como la respuesta cos este: [detailController setPopover:aPopover]; es lo que yo necesitaba. Thx
    Sí, estoy de acuerdo. No había mucho de una elección dado mi horario de tiempo, pero va a cambiar «en el futuro». Me alegra poder ayudar! Saludos, Pablo
    se puede utilizar en una Aplicación Universal o en un pre-3.2 aplicación». Sí, sí puede. Mientras su SDK Base es de 3.2, se ejecutará correctamente cuando se implementa en pre-3.2 dispositivos.
    Útil post. Gracias
    gracias…esto realmente me ayudó y fue exactamente lo que necesitaba 🙂

    OriginalEl autor Paul Peelen

  2. 1

    Aquí hay otra solución simple.

    He encontrado que debemos de seguir los siguientes pasos para claramente desestimar popovers.

    1. descartar una ventana emergente.
    2. liberación de una vista cargado por la ventana emergente.

    Antes de iOS8, casi todos de nosotros puede liberar una vista cargado por una ventana emergente en primer lugar, y luego nos descartar mediante programación la ventana emergente.
    Sin embargo, en iOS8, hacemos los pasos en la solapa.

    Antes de iOS8, mi código de despedir a una ventana emergente

    //creating a popover loading an image picker
    picker = [[UIImagePickerController alloc] init];
    ...
    pickerPopover = [[UIPopoverController alloc] initWithContentViewController:picker];
    [pickerPopover presentPopoverFromRect:aFrame inView:aView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    
    //dismissing the popover
    [picker.view removeFromSuperview]; //(1) release a view loaded by a popover
    [picker release], picker = nil;
    
    if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) {
        [pickerPopover dismissPopoverAnimated:YES]; //(2) dismiss the popover
    }

    En iOS8, en la que desestimaba el código de la parte debe ser cambiado a continuación,

    if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) {
        [pickerPopover dismissPopoverAnimated:YES];  //(2) dismiss the popover first
    }
    
    [picker.view removeFromSuperview]; //(1) and then release the view loaded by the popover
    [picker release], picker = nil;

    OriginalEl autor alones

Dejar respuesta

Please enter your comment!
Please enter your name here