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
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top