I have a problem dismissing a popover that was launched from the navigationItem of a UINavigationController. It seems that the navigation item which is inserted by the UINavigat
I've faced this problem recently and none of the solutions that I've seen around worked for me. Then after some research I've found out a way that works like a charm.
First you need to add the UIStoryboardPopoverSegue
to your class.
@property (nonatomic, strong) UIStoryboardPopoverSegue *popoverSegue;
Synthesize it inside of the class implementation:
@synthesize popoverSegue;
Afterwards, inside of the function called by your button when pressed add the following code:
([[popoverSegue popoverController] isPopoverVisible]) ?
[self.popoverSegue.popoverController dismissPopoverAnimated: YES] :
[self performSegueWithIdentifier: @"popSegue" sender:nil];
Now you are almost ready. inside of the method
- (void) prepareForSegue:(UIStoryboard)segue sender:(id)sender
add the following code:
if([[segue identifier] isEqualToString:@"popSegue"]){
self.popoverSegue = (UIStoryboardPopoverSegue*) segue;
if(viewPopoverController == nil){
viewController = [[UIViewController alloc] init];
viewPopoverController = [[UIPopoverController alloc] initWithContentViewController:viewController];
}
}
Now every time you press the button it will either show or dismiss your window, the window will also be dismissed if you press outside of the popover. I hope it can help someone.
There might be a better solution than this, but why not only add the UITapGestureRecognizer to the navBar whenever the popover is open? Once you tap the button to open the popover, add the TapGestureRecogniser to the navBar. Once you dismiss the popover, remove the TapGestureRecogniser from the navBar.
https://stackoverflow.com/a/12874772/1455770
after presenting a popover from a bar button item, the popover has had its "passthroughViews" set to include the nav bar, so your taps don't register. Set the passthroughviews to nil straight after you present the popover. ie.
self.myPopoverController presentPopoverFromBarButtonItem:myBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
self.myPopoverController.passthroughViews = nil;// at this point the myPopoverController has had its pass through views set to include the whole nav bar. remove it.
Here's the complete description for popovers in storyboards. Assuming your controller to appear in the popover is named MyPopupController
, do this:
MyPopupController
scene, using style Popover
.Add a property to MyPopupController.h
@property (weak, nonatomic) UIPopoverController *popover;
Synthesize the property in MyPopupController.m
@synthesize popover = _popover
In the prepareForSegue:sender:
method of the main scene controller, set up the popover
property:
UIStoryboardPopoverSegue *ps = (UIStoryboardPopoverSegue *)segue;
MyPopupController *dc = ps.destinationViewController;
dc.popover = ps.popoverController;
In the viewWillAppear:
method of MyPopupController
, add the following code (don't forget [super viewWillAppear]
as well):
self.popover.passThroughViews = nil;
You should be done now.
Thanks to Robert for the basic idea - I just had to find the correct place because presentPopoverFromBarButtonItem
is not used when using storyboards. Note that putting (5) into viewDidLoad
does not work.
Have fun coding!