2012-01-13 5 views
0

J'essaie d'utiliser Segue pour présenter puis rejeter une vue Popover un UIBarButtonItem est cliqué.Segue Popover ne se comportera pas correctement

J'ai créé un Segue générique qui n'ancré à rien mais la vue et lui a donné un nom

J'ai Ancré le UIBarButtonItem dans le Générateur Interface:

- (IBAction)clickedSettings:(id)sender { 

    if(self.popSegue != nil) { 
     [self.popSegue.popoverController dismissPopoverAnimated:YES]; 
    } else { 
     //Current says only a button may 
     [self performSegueWithIdentifier:@"Settings" sender:sender]; 
    } 
} 

Mais quand jamais je clique sur le bouton pour afficher la Segue il me donne une erreur:

en raison de l'application Mettre fin exception uncaught « NSInternalInconsistencyException », la raison: « UIStoryboardPopoverSegue doit être présenté à partir d'un bouton de la barre élément ou une vue.

Il ne touche même pas mon -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

J'ai lu les questions suivantes sur la pile:

  1. iOS:How to dismiss Popover
  2. UIBarButtonItem + popover segue creates multiple popovers

Mais je comprends toujours le même Erreur. Pour la vie de moi je ne peux pas comprendre ce qui se passe mal

+0

u trouver une ne solution pour cela? – iosMentalist

Répondre

3

Je prends aucun crédit pour cela depuis que je suis tout peu de passer au travers de plusieurs threads stackoverflow, mais je suis arrivé ce travail avec:

@interface MyViewController() 
- (IBAction) toggleSettingsInPopover: (id) sender; 
@property (nonatomic, strong) UIStoryboardPopoverSegue *settingsPopoverSegue; 
@end 

@implementation MyViewController 
@synthesize settingsPopoverSegue = _settingsPopoverSegue; 

- (IBAction) toggleSettingsInPopover: (id) sender { 
    if([self.settingsPopoverSegue.popoverController isPopoverVisible]) { 
     [self.settingsPopoverSegue.popoverController dismissPopoverAnimated: YES]; 
     self.settingsPopoverSegue = nil; 
    } else { 
     [self performSegueWithIdentifier: @"Settings" sender: sender]; 
    } 
} 

- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender { 
    if([segue.identifier isEqualToString: @"Settings"]) { 
     if([segue isKindOfClass: [UIStoryboardPopoverSegue class]]) 
      self.settingsPopoverSegue = (UIStoryboardPopoverSegue *) segue; 
     MySettingsViewController *msvc = segue.destinationViewController; 
     msvc.delegate = self; 
    } 
} 
@end 

Dans mon story-board, j'ai contrôlé-déplacé de l'élément de mon bouton de barre de paramètres vers MyViewController et l'ai connecté à l'action toggleSettingsInPopover. Puis j'ai contrôlé-tiré de MyViewController à la vue pour les paramètres pour créer le segue, définir son type à popover, définir son identifiant à Settings, définir ses directions vers le haut et à gauche (la barre d'outils est au bas de l'écran et le bouton est à l'extrémité droite), puis a été déplacé de Anchor à l'élément du bouton de la barre que j'ai connecté à l'action.

+0

Eh bien, j'ai parcouru beaucoup de discussions et votre réponse est certainement digne de crédit! :-) – Abdo

2

Vous devez ancrer le segment à UIBarButton en faisant glisser la touche Ctrl-Glisser le champ d'ancrage de l'inspecteur d'attributs de segment vers le module UIBarButton.

Si vous le faites dans le sens opposé, Ctrl-Glisser du bouton à la fenêtre pour afficher vous n'aurez pas la possibilité de contrôler le comportement de la Popoverwindow.

(La partie importante est également dans la dernière phrase de la réponse de LavaSlider)

Questions connexes