ipad - modales - Los Popovers no se pueden presentar desde una vista que no tiene ventana
ventana pop up html5 (13)
Acabo de encontrar este problema. Resultó que el parámetro inView: usaba una IBOutlet que no estaba conectada en IB. Por lo tanto, se intentó lanzar el popover en cero. Eso no funciona.
Por lo tanto, asegúrese de estar utilizando una vista válida.
¿Qué indica este error?
"Popovers cannot be presented from a view which does not have a window."
Aparecerá una vista desde la que solicita mostrar su popover. El motivo de este error se debe a que no hizo esta vista como una subvista de la ventana.
[self.view addSubview:displayPopOverVC];
donde displayPopOverVC es el controlador de vista desde el que aparece popOver
Este error también ocurrió cuando el parámetro inView: es incorrecto - para probar try self.view
Hay muchas maneras de llegar a este error. Básicamente, debe esperar para llamar al comando presentPopover
hasta que su vista de llamada se agregue a una ventana. Lo hice de esta manera.
- (void)viewDidAppear:(BOOL)animated
{
[self methodThatDisplaysPopOver];
}
Mi llamada presentPopoverFromRect
está dentro de mi función methodThatDisplaysPopOver
.
Podrías proteger cada llamada de PresentPopover como sugiere MobiMaciek con esto.
if (self.view.window != nil)
[popoverController presentPopoverFromRect:CGRectMake(10, 10, 100, 100) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
Sin embargo, creo que sería mejor entender cuándo se asigna self.view.window y asegúrese de presentarle popover después de que la vista tenga una ventana.
Recibí el mismo mensaje de error al asignar el mismo UIBarButtonItem
a varios elementos de navegación como lo hizo Lewis. Mi ejemplo fue un poco más complicado ya que estaba usando un UISplitViewController
.
En mi RootViewController
tengo una matriz de matrices para lograr múltiples secciones dentro de mi tabla. Cada vez que el usuario hace clic en una fila de la tabla, se coloca un nuevo controlador de vista "detallado" en el panel derecho de mi splitViewController. Antes de configurar leftBarButtonItem = nil
, recibiría una segfault después de 3-4 clics del botón "Menú" con el mismo error que a111. Actualicé mi código para recuperar realmente el controlador de vista detallada anterior y establecí el elemento leftBarButtonItem en nil.
allData
es mi NSMutableArray que contiene varias otras NSMutableArrays como objetos.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Retrieve the new detail view controller
UIViewController *detailViewController = [[self.allData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
// Add the detail view controller to a navigation controller and set the bar style
UINavigationController *detailNavigationController = [[UINavigationController alloc] initWithRootViewController:detailViewController];
detailNavigationController.navigationBar.barStyle = [[NSUserDefaults standardUserDefaults] integerForKey:@"UIBarStyle"];
// Retrieve previous detail view controller and remove the leftBarButtonItem
UINavigationController *previousDetailNavigationController = [splitViewController.viewControllers objectAtIndex:1];
UIViewController *previousDetailViewController = [[previousDetailNavigationController viewControllers] lastObject];
previousDetailViewController.navigationItem.leftBarButtonItem = nil;
// Update the split view controller''s view controllers array.
NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailNavigationController, nil];
splitViewController.viewControllers = viewControllers;
[detailNavigationController release];
[viewControllers release];
// Dismiss the popover if it''s present.
if (popoverController != nil) {
[popoverController dismissPopoverAnimated:YES];
}
// This sets the left bar to nil when in landscape and equal to "Menu" when in portrait.
// We need to remove rootPopoverButtonItem from the previous viewController...
detailViewController.navigationItem.leftBarButtonItem = rootPopoverButtonItem;
}
El mensaje de error fue un poco engañoso al principio, pero las respuestas anteriores me ayudaron. Me pregunto por qué podría hacer clic en el botón "Menú" hasta 3-4 veces diferentes antes de la segfault ... Investigaré más a fondo.
Reemplacé
[actionSheet showFromBarButtonItem:self.navigationController.navigationItem.leftBarButtonItem animated:YES];
con
[actionSheet showInView:self.view];
Tenía el mismo mensaje de error que el OP, en una situación muy similar a la reportada por TPoschel, excepto que tenía un controlador de vista dividida con un controlador de barra de pestañas incrustado en el panel de detalles y un controlador de navegación dentro de este. El elemento del botón de barra se agrega como la barra de navegación leftBarButtonItem.
Solo en iOS5.0 (no 5.1) parece requerir que invalides el elemento del botón de barra en la barra de pestañas que estás dejando al establecerlo en cero. Antes de eso, agrega el botón de la barra a la barra de navegación en la pestaña a la que te diriges.
Si no hago eso, desde la depuración de mi propio código, la propiedad de la ventana del elemento del botón de la barra permanece establecida en cero y causa la excepción al regresar a la pantalla en la que había estado anteriormente. Supongo que como efecto secundario de configurar el leftBarButtonItem en el elemento de navegación, se apaga y establece el marco. Pero no parece molestar a menos que el botón sea diferente de lo que está configurado allí. Por lo tanto, la necesidad de establecerlo a cero cuando se deja una pestaña, a pesar de que técnicamente es el mismo botón que se está pasando.
Volvería a votar la respuesta de TPoschel, excepto que SO no me lo permite.
Tengo este problema
Tenía un UITabBarController
como vista de detalle, y configuré barButtonItem como leftBarButtonItem en los tres controles de navegación en la barra de pestañas.
vcChart.navigationItem.leftBarButtonItem = barButtonItem;
vcAnalysis.navigationItem.leftBarButtonItem = barButtonItem;
vcTechnicals.navigationItem.leftBarButtonItem = barButtonItem;
Resulta que solo el último añadido es válido, y los dos anteriores arrojarían la excepción cuando se toca.
Para solucionarlo, solo configuré el leftBarButtonItem para el controlador de vista visible, y simplemente cambié el barButtonItem al controlador de vista visible cada vez que el usuario cambiaba las pestañas.
Tuve un problema como este. Recibió este mensaje al hacer clic en un elemento de UIBarButton
personalizado que invocó un método de selector con performSeque.
El problema era que mi transición todavía estaba unida al elemento UIBarButton
. Debería haber sido adjuntado a la vista principal del controlador de vista. Cambió esto y funcionó bien.
PD, todo esto comenzó porque quería agregar y el botón "información" a mi UIToolBar
. Este no es uno en la lista proporcionada por el sistema y debería serlo.
la vista a la que está agregando el popover tiene que haberse agregado a una ventana con el método "addSubview:".
Intenta esperar hasta
- (void) didMoveToWindow
se llama para la vista y luego carga el popover
lo que salvó mi vida:
if (self.view.window != nil)
[popoverController presentPopoverFromRect:CGRectMake(44, yCoord, 111, 111) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
añadiendo si la condición ya no se bloquea. Realmente no lo entiendo porque la función presentPopoverFromRect
SIEMPRE se llama. No hay ninguna situación en la que la ventana sea nula, pero de todos modos lo hizo.
editar: tengo este código en viewDidAppear
. Sin embargo, en la mayoría de los casos es suficiente mover viewDidAppear
a viewDidAppear
o didMoveToWindow
pero en mi caso por alguna razón la condición if era necesaria.
sí, tienes razón, pero aún podemos agregar una subvista de la clase para padres. por lo que se puede representar desde una vista que tenga una ventana:
[popoverController.contentViewController.view addSubview:mySubView];
tuve el mismo problema, después de agregar PresentPopOver en viewDidAppear esto fue resuelto
- (void) viewDidAppear:(BOOL)animated{
CGRect popoverRect = screenBounds;
popoverRect.size.width = MIN(popoverRect.size.width,0) ;
popoverRect.origin.x = screenBounds.origin.x;
[popoverController
presentPopoverFromRect:popoverRect
inView:self.view
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
esto estaba sucediendo cuando inView: self.view debería llamarse después de viewDidLoad como lo sugirieron @ hey68You y MobiMaciek.