EDIT: Ces problèmes semblent être fixé iOS 7.1 / Xcode 5.1.1. (Peut-être plus tôt, comme je n'ai pas été en mesure de tester toutes les versions. Certainement après iOS 7.0, depuis que j'ai testé, ça.) Lorsque vous créez une liste des enchaînements à partir d'un UIBarButtonItem
, la séquence permet de s'assurer que la récolte de la liste de nouveau masque la liste plutôt que de montrer un duplicata. Il fonctionne pour le nouveau UIPresentationController
-en fonction liste enchaîne que Xcode 6 crée pour iOS 8, trop.
Depuis ma solution peut être d'intérêt historique à ceux qui soutiennent toujours plus tôt que les versions d'iOS, j'ai laissé ci-dessous.
Si vous stocker une référence à la séquence de la liste de contrôleur, de le rejeter avant de le définir une nouvelle valeur à répéter les invocations de l' prepareForSegue:sender:
, tout ce que vous éviter, c'est le problème d'avoir plusieurs empilement popovers sur appuyer sur le bouton -- vous ne pouvez toujours pas utiliser le bouton pour fermer la fenêtre pop-over comme le HIG recommande (et comme on le voit dans Apple, les applications, etc.)
Vous pouvez profiter de l'ARC de la réinitialisation des références faibles pour une solution simple, si:
1: Segue à partir du bouton
Comme d'iOS 5, vous ne pouviez pas faire ce travail avec une séquence à partir d'un UIBarButtonItem
, mais vous pouvez sur iOS 6 et versions ultérieures. (Sur iOS 5, vous avez de l'enchaîner à partir de la vue contrôleur lui-même, alors l'action du bouton d'appel performSegueWithIdentifier:
après vérification de la liste.)
2: Utilisez une référence à la liste dans -shouldPerformSegue...
@interface ViewController
@property (weak) UIPopoverController *myPopover;
@end
@implementation ViewController
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// if you have multiple segues, check segue.identifier
self.myPopover = [(UIStoryboardPopoverSegue *)segue popoverController];
}
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
if (self.myPopover) {
[self.myPopover dismissPopoverAnimated:YES];
return NO;
} else {
return YES;
}
}
@end
3: Il n'y a pas d'étape trois!
La bonne chose sur l'utilisation de la réduction à zéro la faiblesse de la référence ici est que, une fois que la liste contrôleur est rejeté -- si par programmation en shouldPerformSegueWithIdentifier:
, ou automatiquement par l'utilisateur tapant quelque part d'autre en dehors de la liste -- le ivar va à l' nil
nouveau, donc nous sommes de retour à notre état initial.
Sans réinitialisation de la faiblesse des références, nous aurions également à:
- ensemble
myPopover = nil
lors du rejet en shouldPerformSegueWithIdentifier:
, et
- définir soi-même comme la liste du contrôleur de déléguer afin d'attraper
popoverControllerDidDismissPopover:
et aussi de mettre en myPopover = nil
(nous avons donc les attraper quand la liste est automatiquement rejetée).