Search code examples
iosswiftuibarbuttonitempopoverrightbarbuttonitem

Showing dropdown menu (popover) below BarButtonItem on click


When I click "+" I want to show menu (popover) under the right BarButtonItem where will be two options. Pressing one of those options will lead to other view controllers.

I'm using Xcode 10 and Swift 4.2.

enter image description here

Like this: enter image description here

This is my code for now and nothing happen. What i do wrong? Can i write on different way?

import Foundation

class RootVC: UITableViewController {

    @IBOutlet weak var openSideMenu: UIBarButtonItem!

    let itemArray = ["1", "2", "3"]

    override func viewDidLoad() {
        super.viewDidLoad()

        openSideMenu.target = self.revealViewController()
        openSideMenu.action = #selector(SWRevealViewController.revealToggle(_:))
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return itemArray.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "RootCell", for: indexPath)

        cell.textLabel?.text = itemArray[indexPath.row]

        return cell
    }

    @IBAction func addBarButtonPressed(_ sender: UIBarButtonItem) {
        let menu = UIMenuController.shared
        menu.menuItems =
            [UIMenuItem(title: "Test me", action: Selector("deleteLine")),
             UIMenuItem(title: "Test me", action: Selector("deleteLine")),
             UIMenuItem(title: "Test me", action: Selector("deleteLine"))]

        menu.setTargetRect((self.navigationItem.rightBarButtonItems?.first?.frame)!, in: self.view)
        becomeFirstResponder()
        menu.setMenuVisible(true, animated: true)

    }

}
extension UIBarButtonItem {

    var frame: CGRect? {
        guard let view = self.value(forKey: "view") as? UIView else {
            return nil
        }
        return view.frame
    }

}

Solution

  • I solve my problem using AssistoLab/DropDown CocoaPods (link)

    enter image description here

    enter image description here

    This is code:

    import Foundation
    import DropDown
    
    class ViewController: UIViewController {
    
       @IBOutlet weak var addBarButton: UIBarButtonItem!
    
       let rightBarDropDown = DropDown()
    
       override func viewDidLoad() {
          super.viewDidLoad()
    
          rightBarDropDown.anchorView = addBarButton
          rightBarDropDown.dataSource = ["Generate New", "Add Manual"]
          rightBarDropDown.cellConfiguration = { (index, item) in return "\(item)" }
       }
    
       @IBAction func showBarButtonDropDown(_ sender: AnyObject) {
    
          rightBarDropDown.selectionAction = { (index: Int, item: String) in
            print("Selected item: \(item) at index: \(index)") }
    
          rightBarDropDown.width = 140
          rightBarDropDown.bottomOffset = CGPoint(x: 0, y:(rightBarDropDown.anchorView?.plainView.bounds.height)!)
          rightBarDropDown.show() 
       }
    }