UIPopoverController, Xcode 6, IOS 8 using Swift

13,321

Solution 1

Here is a simple example for iOS 8. Popover are presented using adaptivity apis in iOS 8.

class PlayerInformationTableViewController: UITableViewController, UIPopoverPresentationControllerDelegate, NSFetchedResultsControllerDelegate{

   ...


  @IBAction func addPopover(sender: UIBarButtonItem){
    let playerInformationViewController =  PlayerInformationViewController()
    playerInformationViewController.modalPresentationStyle = .Popover
    playerInformationViewController.preferredContentSize = CGSizeMake(300, 300)



    let popoverPresentationViewController = playerInformationViewController.popoverPresentationController
    popoverPresentationViewController?.permittedArrowDirections = .Any
    popoverPresentationViewController?.delegate = self
    popoverPresentationController?.barButtonItem = sender
    presentViewController(playerInformationViewController, animated: true, completion: nil)
  }


  func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle{
    return .None
  }

}

Solution 2

Display Popover with contentView from xib

func showPopover(sender: AnyObject) {

    let contentViewController = UINib(nibName: "ContentVC", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as ContentVC
    contentViewController.modalPresentationStyle = UIModalPresentationStyle.Popover

    var detailPopover: UIPopoverPresentationController = contentViewController.popoverPresentationController!
    detailPopover.delegate = self
    detailPopover.barButtonItem = sender as UIBarButtonItem
    detailPopover.permittedArrowDirections = UIPopoverArrowDirection.Any
    presentViewController(contentViewController,
        animated: true, completion:nil)
}

Next allows to make not full screen PopoverView on iPhone for this do not forget to inherit MainViewController: UIPopoverPresentationControllerDelegate and set delegate to PopoverView

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle 
{
    return .None
}
Share:
13,321
Paul S.
Author by

Paul S.

Updated on June 04, 2022

Comments

  • Paul S.
    Paul S. almost 2 years

    I'm having some trouble getting a UIPopover to appear using swift. The code that is commented out works fine in Objective-C, but doesn't work using Swift. When I tap the + in my view controller I do get the "click" in my debugger, however no popover appears.

    class PlayerInformationTableViewController: UITableViewController, NSFetchedResultsControllerDelegate, UIPopoverControllerDelegate {
    
        @IBOutlet weak var addBarButtonItem: UIBarButtonItem!
    
        var playerInformationViewController = PlayerInformationViewController()
        var popover:UIPopoverController?    = nil
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            /*
    
            //setup the popover
            _cuesPopoverViewController          = [self.storyboard instantiateViewControllerWithIdentifier:@"CuesPopoverViewController"];
            self.cuesPopover                    = [[UIPopoverController alloc] initWithContentViewController:_cuesPopoverViewController];
            self.cuesPopover.popoverContentSize = CGSizeMake(540, 300);
            self.cuesPopover.delegate           = self;
    
            */
    
        playerInformationViewController.storyboard?.instantiateViewControllerWithIdentifier("PlayerInformationViewController")
        popover?.contentViewController = playerInformationViewController
        popover?.popoverContentSize = CGSizeMake(300, 300)
        popover?.delegate = self
    
    
            // Uncomment the following line to preserve selection between presentations
            // self.clearsSelectionOnViewWillAppear = false
    
            // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
            // self.navigationItem.rightBarButtonItem = self.editButtonItem()
        }
    
    @IBAction func addPopover(sender: AnyObject) {
    
        println("Click")
    
        popover?.presentPopoverFromBarButtonItem(addBarButtonItem, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
    
    }
    

    Solution

      override func viewDidLoad() {
            super.viewDidLoad()
    
         }
    
    @IBAction func addPopover(sender: AnyObject) {
    
        var popoverViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PlayerInformationViewController") as UIViewController
        popoverViewController.modalPresentationStyle = .Popover
        popoverViewController.preferredContentSize   = CGSizeMake(450, 450)
    
        let popoverPresentationViewController = popoverViewController.popoverPresentationController
    
        popoverPresentationViewController?.permittedArrowDirections = .Any
        popoverPresentationViewController?.delegate = self
        popoverPresentationViewController?.barButtonItem = sender as UIBarButtonItem
    
        presentViewController(popoverViewController, animated: true, completion: nil)
    
    }
    
  • Paul S.
    Paul S. over 9 years
    This works great, with a minor typo. popoverPresentationViewController?.barButtonItem = sender as UIBarButtonItem. now that the popover "pops" why isn't it showing what I have in the interface builder?
  • Sandeep
    Sandeep over 9 years
    The problem with this code above is that, I am instantiating a new viewController from the code. So, if you use storyboard to instantiate your viewController, that probably solves your problem of now showing the UI elements in interface builder.
  • Paul S.
    Paul S. over 9 years
    How would I add playerInformationViewController.storyboard?.instantiateViewC‌​ontrollerWithIdentif‌​ier("PlayerInformati‌​onViewController") to use my storyboard, and not create a new view controller?
  • Sandeep
    Sandeep over 9 years
    Use self.storyboard?.instantiateViewControllerWithIdentifier("Pl‌​ayerInformationViewC‌​ontrollerIdentifier"‌​) if you are using storyboard for your application.
  • Paul S.
    Paul S. over 9 years
    still shows a new UIViewController if I add self.storyboard?. the view controller that I want to use as the popover is PlayerInformationViewController
  • Sandeep
    Sandeep over 9 years
    You might be doing something wrong. Is this PlayerInformationViewController being loaded from storyboard ?
  • Paul S.
    Paul S. over 9 years
    Posted solution. Thanks @insane-36