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
}
Author by
Paul S.
Updated on June 04, 2022Comments
-
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. over 9 yearsThis 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 over 9 yearsThe 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. over 9 yearsHow would I add playerInformationViewController.storyboard?.instantiateViewControllerWithIdentifier("PlayerInformationViewController") to use my storyboard, and not create a new view controller?
-
Sandeep over 9 yearsUse self.storyboard?.instantiateViewControllerWithIdentifier("PlayerInformationViewControllerIdentifier") if you are using storyboard for your application.
-
Paul S. over 9 yearsstill shows a new UIViewController if I add self.storyboard?. the view controller that I want to use as the popover is PlayerInformationViewController
-
Sandeep over 9 yearsYou might be doing something wrong. Is this PlayerInformationViewController being loaded from storyboard ?
-
Paul S. over 9 yearsPosted solution. Thanks @insane-36