Fermez le popover et ouvrez un nouveau avec un robinet
-
29-10-2019 - |
Question
Les "directives de l'interface humaine mobile" d'Apple indiquent des popoverses:
Lorsque cela est possible, permettez aux gens de fermer un popover et d'ouvrir un nouveau avec un robinet. Ce comportement est particulièrement souhaitable lorsque plusieurs boutons de barres différents ouvrent chacun un popover, car il empêche les gens d'avoir à faire des robinets supplémentaires.
La seule solution que je puisse penser en ce moment est de suivre la position du toucher lors du rejet du popover et de vérifier si c'était la position d'un autre bouton. Y a-t-il un moyen plus facile de le faire?
PS: J'ai cherché dans StackOverflow et Google sur Google un certain temps avant de publier. Désolé, si cela a déjà été demandé ici.
METTRE À JOUR
Je suppose que je ne me suis pas bien expliqué. Disons que j'ai trois boutons. Tous ouvrent un popover. Mon utilisateur tape sur le bouton n ° 1 et une popover s'ouvre. Pendant que le popover est ouvert, l'utilisateur exploite le bouton n ° 2. Le popover est rejeté (parce que l'utilisateur tapé en dehors de la popover - comportement par défaut des popovers non modales) et un nouveau popover s'ouvre car l'utilisateur avait cliqué sur le bouton n ° 2. Tout cela sans avoir à taper deux fois: une fois pour rejeter le popover et deux fois pour avoir ouvert le nouveau.
2e mise à jour
J'ai construit un mannequin simple pour reproduire ce que j'essaie de faire. Lorsque l'utilisateur puise sur un bouton et un popover est ouvert, la méthode qui ouvre la popovers n'est pas appelée. Par conséquent, l'utilisateur doit cliquer deux fois pour ouvrir le deuxième popover. Des idées?
#import "RootViewController.h"
#import "AViewController.h"
@interface RootViewController()
@property (nonatomic, retain) UIPopoverController *currentPopover;
@end
@implementation RootViewController
@synthesize currentPopover;
- (void)loadView
{
CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
UIView *view = [[UIView alloc] initWithFrame:applicationFrame];
CGRect buttonFrame = CGRectMake(50, 100, 200, 40);
for (int i = 0; i < 3; i++)
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:[NSString stringWithFormat:@"Button %i", i + 1] forState:UIControlStateNormal];
[button addTarget:self action:@selector(openPopover:) forControlEvents:UIControlEventTouchDown];
[button setFrame:buttonFrame];
[view addSubview:button];
buttonFrame.origin.y += 50;
}
self.view = view;
[view release];
}
- (IBAction)openPopover:(id)sender
{
AViewController *avc = [[AViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:avc];
[avc release];
UIPopoverController *tempPopover = [[UIPopoverController alloc] initWithContentViewController:navigationController];
[tempPopover setDelegate:self];
[tempPopover setPopoverContentSize:CGSizeMake(320, 500)];
[tempPopover presentPopoverFromRect:[sender frame] inView:[self view] permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
self.currentPopover = tempPopover;
[tempPopover release];
[navigationController release];
}
- (void)dealloc
{
[currentPopover release];
[super dealloc];
}
@end
La solution
Si vous utilisez des éléments de bouton de bar dans une barre d'outils, le popover ouvert est ne pas Fermé automatiquement lorsque vous appuyez sur un autre élément de bouton de barre. Dans ces situations, vous devez fermer le popover visible et ouvrir l'autre en un.
Autres conseils
- (IBAction)sortAction {
[searchBarView resignFirstResponder];
[self.popoverController dismissPopoverAnimated:YES]; //clear popover
self.popoverController = popoverSetting;
[self.popoverController presentPopoverFromBarButtonItem:sortBarButtonItem
permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; //show popover
}
Hope vous aidera
Disons que vous avez 3 boutons et que chacun ouvre une fenêtre contextuelle. Vous pouvez utiliser une variable d'état qui suit si une fenêtre contextuelle est actuellement ouverte, et à l'intérieur de chaque méthode "ouverte", fermez la méthode existante (si elle est ouverte) avant d'ouvrir la nouvelle fenêtre contextuelle.