Respingendo iPad UIPopoverController quando BarButtonItem è spinto mentre è aperto
-
27-09-2019 - |
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.)
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;