UIPopoverController not dismissed when opened from self.navigationItem (inside UINavigationController)

前端 未结 4 1655
醉话见心
醉话见心 2021-01-24 21:06

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

相关标签:
4条回答
  • 2021-01-24 21:44

    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.

    0 讨论(0)
  • 2021-01-24 21:55

    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.

    0 讨论(0)
  • 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.
    
    0 讨论(0)
  • 2021-01-24 22:06

    Here's the complete description for popovers in storyboards. Assuming your controller to appear in the popover is named MyPopupController, do this:

    1. Define a segue from the main scene to the MyPopupController scene, using style Popover.
    2. Add a property to MyPopupController.h

      @property (weak, nonatomic) UIPopoverController *popover;
      
    3. Synthesize the property in MyPopupController.m

      @synthesize popover = _popover
      
    4. In the prepareForSegue:sender: method of the main scene controller, set up the popoverproperty:

      UIStoryboardPopoverSegue *ps = (UIStoryboardPopoverSegue *)segue;
      MyPopupController *dc = ps.destinationViewController;
      dc.popover = ps.popoverController;
      
    5. 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!

    0 讨论(0)
提交回复
热议问题