web-dev-qa-db-fra.com

Avertissement: tentative de présentation de ModalTableViewController sur MainTableViewController qui présente déjà (null)

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.

49
derdida

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];
}
55
Aace

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é!

137
Steve

Cela fonctionnera également:

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

Ajoutez simplement cet extrait de code dans ViewDidLoad() de votre uiviewcontroller principal

 definesPresentationContext = true
4
Naomi Osaka

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.

4
Vaibhav Saran

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];
    }];
3
Tim

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.

1
zero0cool

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.

0
Willy