8
votes

UIBARBUTTONITEM + POPOVER SEGUE crée plusieurs collovrés

J'ai actuellement une application iPad avec un uitoolbar contenant deux uibarbuttonitems, chacun d'entre eux qui est connecté à une séance de popover.

Lorsque l'utilisateur touche l'un des uibarbuttonitems, la pondéreuse est créée plutôt que de basculer. Cela crée plusieurs ponphères de chevauchement. J'ai été en mesure de fermer le Popover créé précédemment à l'aide du code suivant P>

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // First close the preferences popover if it's open per Apple guidelines
    if ([self.popoverA.popoverController isPopoverVisible]) {
        [self.popoverA.popoverController dismissPopoverAnimated:YES];
    }

    if ([self.popoverB.popoverController isPopoverVisible]) {
        [self.popoverB.popoverController dismissPopoverAnimated:YES];
    }
    ... code to manage segues ...
}


1 commentaires

Juste pour clarifier mon problème. Le comportement attendu est que chaque fois que le bouton (UIBARBUTTONITEM) est touché, la ponphère doit être basculée ouverte ou fermée plutôt que de toujours ouverte. La SEGUE, cependant, semble toujours créer une autre ponphère plutôt que de rejeter un existant visible. Lorsqu'ils sont liés à un UIBUTTON, les Popovers sont basculés de manière appropriée.


3 Réponses :


8
votes

Au moment où vous êtes envoyé sur -prepareforsegue: expéditeur: code>, il est trop tard pour annuler une Segue.

Pour ce faire efficacement, vous devez créer des segues sur vos collovrés à partir du contrôleur d'affichage lui-même au lieu des boutons de barre afin qu'ils puissent toujours être exécutés par programmation. Maintenant, câblez le uibarbuttonitem code> S jusqu'à certaines méthodes présentes de manière conditionnelle ou rejettera la popover. P>

- (IBAction)showPopoverA
{
    if (self.popoverA.popoverController.popoverVisible)
        [self.popoverA.popoverController dismissPopoverAnimated:YES];

    [self performSegueWithIdentifier:@"ShowPopoverA"];
}


6 commentaires

Merci pour le conseil, je vais essayer ça!


Après avoir essayé cette suggestion, j'obtiens l'erreur suivante: application de terminaison en raison d'une exception non capturée 'NsinternalcONSistencyException', raison: 'UISTORYBOORPOPOVERGUE doit être présentée à partir d'un élément de bouton de barres ou d'une vue.


- (ibaction) showpopovera: (ID) expéditeur {if ([auto.popovera.popovercontroller ispoppovervisible]) {[Self.Poppovera.Poppovercontroller Démissopoveranimated: Oui]; } [SelfacsCertainwithIdentifier: @ "ShowPoppoverasegue" Sender: expéditeur]; }


- (void) PREPARYFORSEGUEGUEGUEGRUEURGUE: (ID) Sender: (ID) Sender {if ([[[[[[[[[[[SEGUE IDENTINICIFIER] ISEQUALTOSTRING: @ "UINAVIGATIONCONTROLLER * NAVCONTROLLER = [(UISTYBARDPOPOVERSEURE *) SEGUE Destinationvoller]; PréférencesVC * DVC = [[NAVCONTROLLER VIEWCONTROLLULES] ObjectAindex: 0]; [DVC SetunerPrefs: Self.Userprefs]; [SetDelegate DVC: auto]; // utilisé pour fermer Popover [Self SetPrefspover: (UISTYBOARBOARDPOPOVERSEGUELLE *) SEGUE]; [Self.Prefspoppover.PoppoverController SetDelegate: auto]; }


Désolé pour le manque de rendements de la voiture. Je n'arrive pas à être capable de formater mes commentaires pour être plus lisible.


Deviner. Vous devez régler l'ancrage de la Segue à l'UIBARBUTTNITME approprié. Aussi, constaté que pour basculer, le [Self SacsfactSewithIdentifier: l'expéditeur] devrait être dans une clause d'autre (sinon le problème revient). Merci encore pour la pointe, cela m'a mis sur la bonne voie.



16
votes

C'est la bonne façon de faire ce que vous devez faire:

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    if ([identifier isEqualToString:@"SurveyListPopover"]) {
        if (self.surveyListPopover == nil) {
            return YES;
        }
        return NO;
    }
    return YES;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"SurveyListPopover"]) {
        // Assign popover instance so we can dismiss it later
        self.surveyListPopover = [(UIStoryboardPopoverSegue *)segue popoverController];
    }
}


3 commentaires

Si vous ciblez 6.0+, c'est la meilleure approche.


Est-ce juste moi ou dans iOS 5 DépôferformsewithIdentifier ne s'appelle pas du tout?


développeur.apple.com/library/ios/documentation/uikit/referenc e / ... : semble qu'il a été introduit dans iOS 6.0 et plus



1
votes

Combinaison des deux le fait pour moi

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"showPopover"]) {
        self.tableOfContentsPopoverController = [(UIStoryboardPopoverSegue*)segue popoverController];
    }
}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    if ([identifier isEqualToString:@"showPopover"]) {
        if (!self.tableOfContentsPopoverController.popoverVisible) {
            return YES;
        }
        return NO;
    }
    return YES;
}


0 commentaires