switch stepper activity ios cocoa-touch popover

activity - stepper ios



Advertencia: intente presentar ModalTableViewController en MainTableViewController que ya está presentando(nulo) (9)

Tengo un problema con un popover. Si toco una celda, cargaré un popover para seleccionar más detalles. Todo funciona bien, pero cuando presiono mi celda nuevamente recibo cada vez el siguiente mensaje:

Advertencia: intento de presentar ModalTableViewController ... en MainTableViewController ... que ya está presentando (nulo)

Si toco en otra celda, no recibiré esta Advertencia. Solo si toca la misma fila nuevamente.

Intenté muchas cosas, pero no puedo resolver este problema. Cargué mi popover con esto:

var popover: UIPopoverController! var popoverContent: ModalTableViewController!

y en mi celular toque:

popoverContent = self.storyboard.instantiateViewControllerWithIdentifier("ModalTableViewController") as ModalTableViewController popoverContent.selectedQuestionID = indexPath!.row popover = UIPopoverController(contentViewController: popoverContent) popover.delegate = self popover.presentPopoverFromRect(currentCell.LabelCellTitle.frame, inView: currentCell.LabelCellTitle.superview, permittedArrowDirections: UIPopoverArrowDirection.Left, animated: true)

Y despedir

func popoverControllerDidDismissPopover(popoverController: UIPopoverController!) { popover.dismissPopoverAnimated(false) // just to check self.popover = nil self.popoverContent = nil }

¿Algunas ideas?

Editar:

Si consulto con:

if(self.popoverContent == nil) {

antes de abrirlo, descubriré que no es nada nuevo cuando toco la misma celda nuevamente.

Editar de nuevo:

Tengo el mismo problema si lo creo con una configuración un poco diferente:

Botón personalizado 1x1px. Conecte popover con segue. Al tocar la celda, mueve el botón a la celda y abre el popover.

Por lo tanto, no hay ningún código para abrir el popover, solo con el editor de guiones gráficos.

Recibo el mismo mensaje de error (a veces) solo si toco el mismo popover de nuevo.


Aún no estoy activo, pero para Objective-C, terminé envolviendo la presente llamada de ViewController en una llamada a performSelector.

-(void) present { [self performSelector: @selector(ShowModalTableViewController) withObject: nil afterDelay: 0]; } -(void) ShowModalTableViewController { [self presentViewController: ctrlModalTableViewController animated: true completion: nil]; }


En mi caso, accidentalmente vinculo mi botón a un IBAction y Storyboard Segue con el tipo Present As Popover al mismo tiempo. Lo que hice para arreglar esto fue eliminar el enlace del evento Touch Up Inside mi botón a IBAction y usar solo Storyboard Segue .


Este es un problema de iOS 8 en iPad en realidad y no ocurrirá en iOS por debajo de 8. Puede poner una condición allí:

if ([controller respondsToSelector:@selector(popoverPresentationController)]) { // iOS8 controller.popoverPresentationController.sourceView = self.view; // or any of your UIiew }

Pero considere el punto de Steve también ( https://.com/a/26380194/362310 ) a continuación con este cambio de código.


Esto funcionará también:

dispatch_async(dispatch_get_main_queue(), ^ { [self presentViewController:vc animated:YES completion:nil]; });


Esto sucede si se presenta una UIActionSheet en el momento de la nueva llamada de presentación de controlador de vista, por ejemplo, este código funciona para mí

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ [controller presentViewController:modalViewController animated:YES completion:NULL]; }];


Para mí, esto sucedió cuando tenía dos elementos UIBarButton como parte de un NavigationItem y ambos tenían un segue desencadenado para abrir vistas como popover, con sus propios controladores. Un popover no descarta automáticamente al tocar el otro BarButtonItem. Sin embargo, descartaría que hiciera tapping en otro lugar fuera del popover. Terminé reemplazando UINavigationController y agregando una versión extendida de presentViewController:animated:completion

/* * Workaround for apparent bug in iPad that popover does not automatically dismiss if another bar button item is pressed */ - (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion { /* * Make sure this runs in the main queue */ dispatch_async(dispatch_get_main_queue(), ^ { if ( [self.presentedViewController isKindOfClass:[ViewController1 class]] || [self.presentedViewController isKindOfClass:[ViewController2 class]] || [self.presentedViewController isKindOfClass:[ViewController3 class]] || [self.presentedViewController isKindOfClass:[ViewController4 class]] ) { [self dismissViewControllerAnimated:YES completion:^{ [super presentViewController:viewControllerToPresent animated:flag completion:completion]; }]; } else { [super presentViewController:viewControllerToPresent animated:flag completion:completion]; } }); }

Creo que el dispatch_async(dispatch_get_main_queue(), ^ {}) no es realmente necesario, solo lo agregué como precaución.


Parece que esto es cierto de presentar algo sobre un popover. La razón por la que funcionan todas las respuestas anteriores es probable porque cualquier acción que se tome ocurre antes de que se descarte el popover (o la hoja de actividades, o similar).

Si puede, intente descartar el popover primero y luego presentar su modal.


Simplemente agregue este fragmento de código en ViewDidLoad() de su control uiview principal

definesPresentationContext = true


Tuve este problema porque estaba tratando de realizar segue / present desde dentro:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

Lo cambié a:

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex

y lo arregló!