Domanda

Utilizzando una vista combinata sul iPad, ho il seguente codice:

- (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;
}

Questo metodo funziona bene per mostrare la popover quando si preme il pulsante. Tuttavia, mi piacerebbe anche dire avere la popover respingere, se si preme il pulsante mentre è già aperto a seguire buone linee guida. Come potrei fare per fare questo? (Vale a dire se l'utente fa clic più volte su questo pulsante, il popover dovrebbe venire e nascondere ogni altro colpo.)

È stato utile?

Soluzione

Quando si chiamerà visualizzazione splitViewController popover, qui di seguito il metodo. Basta controllare se non nullo, poi respingerlo:)

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

Altri suggerimenti

HIG di Apple dice che non ci dovrebbe essere un esplicito pulsante respingere all'interno di un popover, ma per fare quello che stai chiedendo, avete due opzioni.

1) inviare un NSNotification

o

2) drill-down nella vostra gerarchia della vista fino ad avere l'istanza popover

1) in qualsiasi vista si sta presentando il popover nel, nel metodo viewDidLoad:

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

creare un metodo chiamato "dismissThePopover" e nel metodo dealloc, removeObserver

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

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

Nel tasto tua popoverController "respingere", inserire questa riga:

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

Facendo che invia una notifica al app, e visto che hai registrato il tuo altro controller della vista di ascoltare per questo, ogni volta che vede che la notifica si chiama il selettore specificato, in questo caso, dismissThePopover.

2) drill-down nella gerarchia immagine per trovare self.popoverController

controllare questo fuori, il vostro sarà diverso, sicuramente, ma l'idea generale è la stessa. Inizia a vostra AppDelegate, mossa nella prima viewcontroller, mossa in subviews fino ad arrivare all'oggetto 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!

Spero che questo aiuti

Questo è molto più facile perché il popoverController è una proprietà. Rende più facile riferimento.

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];
}

In realtà ho appena realizzato che si sta facendo riferimento al codice all'interno del metodo delegato per la visualizzazione del viewController all'indice: 0 del SplitView. Questa risposta non si applica necessariamente a questo, ma si applica a qualsiasi altro momento si sta accedendo e creando popoverControllers su iPad. Senza verificare se un popover è visibile prima, si sia in crash, o aprire più popovers.

Grazie per il vostro tempo.

Si potrebbe provare il seguente

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

Se si sta utilizzando la configurazione di default UISplitViewController, quindi il pulsante di barra di navigazione che viene creato visualizza un popover del vostro RootViewController.

Se si vuole fare in modo che non dispone di più pop-up in una sola volta, si può semplicemente respingere pop-up ogni volta che apparirà il tuo RootViewController. il codice di Qui ho usato per risolvere questo problema:

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

Il codice che ho usato per mostrare la popover in 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];
}

Questo ho usato per cercare di respingerlo da un'altra classe:

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

I miei sguardi funzione dismissPopover come:

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

Sì, è possibile impostare il modalPresentationStyle come segue:

controller.modalPresentationStyle = UIModalPresentationFormSheet;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top