单击时在BarButtonItem下面显示下拉菜单(弹出式菜单)

时间:2018-09-30 09:07:38

标签: ios swift uibarbuttonitem popover rightbarbuttonitem

当我单击“ +”时,我想在右侧的BarButtonItem下显示菜单(弹出式菜单),其中有两个选项。按下其中一个选项将导致其他视图控制器。

我正在使用Xcode 10和Swift 4.2。

enter image description here

赞: enter image description here

这是我目前的代码,什么都没有发生。我做错了什么?我可以用其他方式写吗?

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
    }

}

1 个答案:

答案 0 :(得分:6)

我使用AssistoLab / DropDown CocoaPods(link)解决了我的问题

enter image description here

enter image description here

这是代码:

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() 
   }
}