J'ai un problème avec un popover. Si je tape sur une cellule, je chargerai un popover pour sélectionner plus de détails. Tout fonctionne bien, mais lorsque j'appuie à nouveau sur ma cellule, je reçois à chaque fois le message suivant:
Avertissement: tentative de présentation de ModalTableViewController ... sur MainTableViewController ... qui présente déjà (null)
Si je tape sur une autre cellule, je n'obtiendrai pas cet avertissement. Seulement si vous appuyez à nouveau sur la même ligne.
J'ai essayé beaucoup de choses mais je ne suis pas en mesure de résoudre ce problème. Je charge mon popover comme ceci:
var popover: UIPopoverController!
var popoverContent: ModalTableViewController!
et sur mon portable, tapez:
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)
Et de rejeter
func popoverControllerDidDismissPopover(popoverController: UIPopoverController!) {
popover.dismissPopoverAnimated(false) // just to check
self.popover = nil
self.popoverContent = nil
}
Des idées?
Modifier:
Si je vérifie avec:
if(self.popoverContent == nil) {
avant de l'ouvrir, je découvrirai que ce n'est pas nul lorsque j'appuierai à nouveau sur la même cellule.
Modifier à nouveau:
J'ai le même problème si je le crée avec une configuration un peu différente:
Bouton personnalisé 1x1px. Connectez popover avec segue. Sur la cellule, appuyez sur le bouton de déplacement vers la cellule et ouvrez le popover.
Il n'y a donc pas de code pour ouvrir le popover, uniquement avec l'éditeur de storyboard.
Je reçois le même message d'erreur (parfois) juste si je tape à nouveau sur le même popover.
Je ne suis pas encore sur Swift pour l'instant, mais pour Objective-C, j'ai fini par encapsuler l'appel presentViewController dans un appel performSelector.
-(void) present
{
[self performSelector: @selector(ShowModalTableViewController) withObject: nil afterDelay: 0];
}
-(void) ShowModalTableViewController
{
[self presentViewController: ctrlModalTableViewController animated: true completion: nil];
}
J'ai eu ce problème parce que j'essayais d'effectuer un enchaînement/présent de l'intérieur:
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
Je l'ai changé en:
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
et il l'a réparé!
Cela fonctionnera également:
dispatch_async(dispatch_get_main_queue(), ^ {
[self presentViewController:vc animated:YES completion:nil];
});
Ajoutez simplement cet extrait de code dans ViewDidLoad()
de votre uiviewcontroller principal
definesPresentationContext = true
Il s'agit d'un problème iOS 8 sur iPad réellement et ne se produira pas dans iOS ci-dessous 8. Vous pouvez y mettre une condition:
if ([controller respondsToSelector:@selector(popoverPresentationController)])
{
// iOS8
controller.popoverPresentationController.sourceView = self.view; // or any of your UIiew
}
Mais considérez également le point de Steve ( https://stackoverflow.com/a/26380194/36231 ) ci-dessous avec ce changement de code.
Cela se produit si une UIActionSheet est présentée au moment du nouvel appel de présentation du contrôleur de vue, par exemple Ce code fonctionne pour moi
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[controller presentViewController:modalViewController animated:YES completion:NULL];
}];
Pour moi, cela s'est produit lorsque j'avais deux éléments UIBarButton dans le cadre d'un NavigationItem et que les deux avaient une séquence déclenchée pour ouvrir les vues en tant que popover - avec leurs propres contrôleurs. Un popover ne serait pas automatiquement ignoré lorsque vous appuyez sur l'autre BarButtonItem. Il serait cependant rejeté lorsque je tapoté ailleurs en dehors du popover. J'ai fini par remplacer UINavigationController et ajouter une version étendue 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];
}
});
}
Je crois que la dispatch_async(dispatch_get_main_queue(), ^ {})
n'est pas vraiment nécessaire, je l'ai juste ajoutée par précaution.
Dans mon cas, je lie accidentellement mon bouton à un IBAction
et Storyboard Segue
avec gentil Present As Popover
en même temps. Ce que j'ai fait pour résoudre ce problème, c'était de supprimer le bouton Touch Up Inside
lien d'événement vers IBAction
et utilisé uniquement Storyboard Segue
.