Question

En utilisant une vue partagée sur l'iPad, je le code suivant:

- (void) splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc {
  barButtonItem.title = @"Categories";
  NSMutableArray *items = [[toolbar items] mutableCopy];
  [items insertObject:barButtonItem atIndex:0];
  [toolbar setItems:items animated:YES];
  [items release];
  self.popoverController = pc;
}

Cela fonctionne bien pour montrer la popover lorsque le bouton est pressé. Cependant, je voudrais aussi avoir le popover si le rejeter bouton est pressé alors qu'il est déjà ouvert à suivre de bonnes directives. Comment dois-je prendre? (À savoir si l'utilisateur clique sur ce bouton à plusieurs reprises, le popover doit venir se cacher tous les succès.)

Était-ce utile?

La solution

Lorsque l'affichage de splitViewController popover, ci-dessous méthode est appelée. Il suffit de cocher sinon nul, puis le rejeter:)

- (void)splitViewController:(UISplitViewController*)svc popoverController:(UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController{
  if ([pc isPopoverVisible]) {
     [pc dismissPopoverAnimated:YES];
  }
}

Autres conseils

HIG d'Apple dit qu'il ne devrait pas être un bouton explicite dans un popover rejeter, mais de faire ce que vous demandez, vous avez deux options.

1) afficher un NSNotification

ou

2) vers le bas dans votre percez hiérarchie de la vue jusqu'à ce que vous avez l'instance popover

1) selon la vue que vous présentez le popover dans, dans la méthode viewDidLoad:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissThePopover) name:@"popoverShouldDismiss" object:nil];

créer une méthode appelée "dismissThePopover" et dans la méthode dealloc, removeObserver

-(void)dismissThePopover {
    [self.popoverController dismissPopoverAnimated:YES];
}

-(void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

Dans votre bouton popoverController "rejeter", entrez cette ligne:

[[NSNotificationCenter defaultCenter] postNotificationName:@"popoverShouldDismiss" object:nil];

Faire qui envoie une notification à l'application, et puisque vous avez enregistré votre autre contrôleur de vue d'écouter pour cela, chaque fois qu'il voit que la notification appelle le sélecteur que vous spécifiez, dans ce cas, dismissThePopover.

2) vers le bas dans votre percez hiérarchie de la vue de trouver self.popoverController

vérifier, le vôtre sera différent, sûrement, mais l'idée générale est la même. Commencez à votre AppDelegate, déplacer dans la première viewcontroller, déplacer dans subviews jusqu'à ce que vous obtenez à votre objet self.popoverController.

MyAppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
//appDelegate instance, in this case it's the .m file for your ApplicationDelegate

UISplitViewController *svc = appDelegate.splitViewController;
//In this case the first view inside the appDelegate is a SplitView, svc

UINavigationController *navc = [[svc viewControllers]objectAtIndex:0];
//a navigationController is at index:0 in the SplitView hierarchy. DetailView is at index:1

NSArray *vcs = [navc viewControllers];
//vcs is the array of different viewcontrollers inside the Navigation stack for nvc

iPadRootViewController *rootView = [vcs objectAtIndex:0];
//declare the rootView, which is the .m file that is at index:0 of the view array

UIPopoverController *pc = [rootView popoverController];
//HERE WE GO!!! popoverController is a property of iPadRootViewController's instance rootView, hereby referred to as pc.

[pc dismissPopoverAnimated:YES];
//bye bye, popoverController!

Hope this helps

Ceci est beaucoup plus facile parce que le popoverController est une propriété. Facilite la référence.

if ([self.popoverController isPopoverVisible]) {
    //using the setters and getters "goes thru the proper channels" when accessing objects
    [self.popoverController dismissPopoverAnimated:YES];
} else {
    UIPopoverController *pc = [[UIPopoverController alloc] initWithContentViewController:YOUR_VIEW_CONTROLLER];
    self.popoverController = pc;
    [pc release];

    //get the button instance you set on the toolbar
    UIBarButtonItem *categoryButton = [[toolbar items] objectAtIndex:0];
    [self.popoverController presentPopoverFromBarButtonItem:categoryButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

En fait, je viens de réaliser que vous faites référence au code dans la méthode délégué pour afficher l'viewController à l'index: 0 de votre SPLITVIEW. Cette réponse ne concerne pas nécessairement, mais ne s'applique à tout autre moment vous accédez à la création et popoverControllers sur l'iPad. Sans vérifier si un popover est visible d'abord, vous planter soit, ou d'ouvrir plusieurs popovers.

Merci pour votre temps.

Vous pouvez essayer le ci-dessous

if(![popoverController isPopoverVisible]){
   // Show popover
}
else{
   // close popover
   [popoverController dismissPopoverAnimated:YES];
}

Si vous utilisez la configuration par défaut UISplitViewController, puis sur le bouton de la barre de navigation qui est créé affiche une popover de votre RootViewController.

Si vous voulez vous assurer que vous n'avez pas plusieurs pop-ups sur à la fois, vous pouvez simplement rejeter les pop-ups chaque fois que votre RootViewController apparaîtra. le code ici, j'utilisé pour résoudre ce problème:

- (void) viewWillAppear:(BOOL)animated {
  if ([self.popover isPopOverVisible]) {
    [self.popover dismissPopoverAnimated:YES];
  }
  [super viewWillAppear:YES];
}

Le code utilisé pour montrer que je le popover dans RootViewController.m:

- (IBAction) addCategory:(id)sender {
  AddCategoryViewController *content = [[AddCategoryViewController alloc] init];
  UIPopoverController *aPopover = [[UIPopoverController alloc]
                                   initWithContentViewController:content];

  aPopover.delegate = self;

  // Store the popover in a custom property for later use.
  self.addCategoryPopover = aPopover;
  addCategoryPopover.delegate = self;
  [aPopover release];
  [content release];

  [addCategoryPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}

Je l'habitude d'essayer de le rejeter d'une autre classe:

-(IBAction)saveAddCategory:(id)sender {
  rootViewController = [[RootViewController alloc] init];
  [rootViewController dismissPopover];
}

Ma fonction dismissPopover ressemble à:

- (void) dismissPopover {
  if ([self.addCategoryPopover isPopoverVisible]) {
    [self.addCategoryPopover dismissPopoverAnimated:YES];
  }
  if (addCategoryPopover.popoverVisible == YES) {
    [addCategoryPopover dismissPopoverAnimated:YES];
  }
}

Oui, vous pouvez régler le modalPresentationStyle comme suit:

controller.modalPresentationStyle = UIModalPresentationFormSheet;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top