Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIPopoverPresentationController on iPhone doesn't produce popover

I'm trying to implement the new UIPopoverPresentationController in my iPhone app (using Objective C). What I want is a simple popover with a tableview that emanates from the initiating button.

--Edit--

Here's my REVISED code, adapted from research in the docs, SO, and from input in comments below:

- (IBAction)selectCategoryBtn:(UIButton *)sender {     [self performSegueWithIdentifier:@"CatSelectSegue" sender:self.selCatButton]; }  -(void) prepareForSegue:(UIStoryboardSegue *) segue Sender:(id) sender {     if (sender == self.selCatButton)     {         if ([segue.identifier isEqualToString:@"CatSelectSegue"])         {             UIPopoverPresentationController *controller = segue.destinationViewController;             controller.delegate = self;             controller.sourceView = self.selCatButton;             controller.sourceRect = self.selCatButton.frame;         }     } }   -(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {     return UIModalPresentationNone; 

Here's my storyboard hookup:

enter image description here

However this simply presents a tableview in a modal fashion, rising up from the bottom and consuming the entire screen.

I've googled, and looked all over SO, but it appears that I'm not the only one confused by what I'd hoped would resolve a nettlesome issue for the iPhone.

Can anyone see a glitch in my code or direct me to a clear tutorial? I've looked, but maybe the API is just so new nobody's got a handle on it yet.

Thanks!

2nd edit:

Here's what gets presented as a result of the code above. I reduced the size of the tableview in the View Controller I expected to be presented as a popover. I colored the background gray, just to clarify what's showing up instead of the popover.

enter image description here

like image 509
rattletrap99 Avatar asked Feb 14 '15 23:02

rattletrap99


People also ask

How do I show popover in iOS?

Add a new file to the project, Select File -> New ->File and then select iOS -> Source -> Cocoa Touch Class. Name it PopoverViewController and make it a subclass of UIViewController. Go back to Main. storyboard and select the added View Controller.


1 Answers

Steps:

A) Link your UIButton to the popover's view controller using the Present As Popover segue type. I actually had to create a new project to get this to appear but it's probably something to do with the base SDK.

B) Make the View Controller containing the UIButton conform to the <UIPopoverPresentationControllerDelegate>. E.g. In your MyViewController.m file add:

@interface MyViewController () <UIPopoverPresentationControllerDelegate> 

C) Add the method below to the View Controller containing the UIButton:

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {      return UIModalPresentationNone; } 

D) Add the following into your prepareForSegue:sender: replacing your segue.identifier check:

if ([segue.identifier isEqualToString:@"CatSelectSegue"]) {     UIViewController *dvc = segue.destinationViewController;     UIPopoverPresentationController *controller = dvc.popoverPresentationController;     if (controller) {         controller.delegate = self;     } } 

Code tested and proof it works:

Popover on iPhone without 3rd Party Controls

Edit: My test app TPOPViewController.m file where the magic happens:

#import "TPOPViewController.h"  @interface TPOPViewController () <UIPopoverPresentationControllerDelegate>//, UIAdaptivePresentationControllerDelegate>  @end  @implementation TPOPViewController  - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {      NSString *identifier = segue.identifier;     if ([identifier isEqualToString:@"popover"]) {         UIViewController *dvc = segue.destinationViewController;         UIPopoverPresentationController *ppc = dvc.popoverPresentationController;         if (ppc) {             if ([sender isKindOfClass:[UIButton class]]) { // Assumes the popover is being triggered by a UIButton                 ppc.sourceView = (UIButton *)sender;                 ppc.sourceRect = [(UIButton *)sender bounds];             }             ppc.delegate = self;         }     } }  - (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {      return UIModalPresentationNone; }  @end 

My test storyboard as well:

Popover on iPhone test storyboard

like image 147
Robotic Cat Avatar answered Oct 02 '22 03:10

Robotic Cat