【问题标题】:Swift menu not showing on right navigation button click快速菜单未显示在右侧导航按钮单击
【发布时间】:2018-03-03 10:58:19
【问题描述】:

Swift 新手。我有一个简单的用户界面:在UIWebView 上放置一个UINavigationBar,以及一个右栏按钮项以具有显示菜单的操作,以允许用户选择不同的页面在网络视图中显示。

显示视图控制器的样子:

class ViewController: UIViewController {
    @IBOutlet weak var webView: UIWebView!
    @IBOutlet weak var menu: UIBarMenuItem!
    @IBOutlet weak var viewnav: UIView!

    override func viewDidLoad() {
        super.viewDidLoad();
        let url = URL(string:"about:blank")
        let req = URLRequest(url:url!)
        webView.loadRequest(req)
    }

    @obj func dummy(){
    }

    @IBAction func MenuShow(sender: UIBarButtonItem){
        let menu = UIMenuController.shared
        viewnav.becomeFirstResponder()
        menu.setTargetRect(viewnav.frame, in:viewnav)

        let dummy = UIMenuItem(title:"Dummy", action: #selector(dummy))

        menu.menuItems = [dummy]
        menu.setMenuVisible(true, animated: true)

        //for test only; should move to menu item actions
        let url = URL(string:"https://www.apple.com")
        let req = URLRequest(url:url!)
        webView.loadRequest(req)    
    }

}

(我已将 web 视图、栏按钮连接到 UI 对象;对于viewnav,我尝试在Main.storyboard 中添加一个新的虚拟视图或使用现有的导航栏,两者都具有相同的结果)

生成的应用程序显示空白页面,当我点击菜单按钮时,跳转到 Apple 的主页,因此上述代码按预期运行。但是菜单没有出现,那么上面的代码有什么问题呢?

(还有一些类似的问题,例如this,但似乎没有解决问题)

【问题讨论】:

    标签: swift uimenucontroller


    【解决方案1】:

    这个answer给出了解决方案:

    override var canBecomeFirstResponder: Bool {
        return true
    }
    

    并将这一行添加到viewDidLoad 方法中

    view.becomeFirstResponder()
    

    完整版:

    class ViewController: UIViewController {
        @IBOutlet weak var webView: UIWebView!
        @IBOutlet weak var menuButton: UIBarMenuItem!
    
        override func viewDidLoad() {
            super.viewDidLoad();
            let url = URL(string:"about:blank")
            let req = URLRequest(url:url!)
            webView.loadRequest(req)
    
            view.becomeFirstResponder()
    
            let menu = UIMenuController.shared
            let dummy = UIMenuItem(title:"Dummy", action: #selector(dummy))
            menu.menuItems = [dummy]
        }
    
        override var canBecomeFirstResponder: Bool {
            return true
        }
    
        @obj func dummy(){
            let url = URL(string:"https://www.apple.com")
            let req = URLRequest(url:url!)
            webView.loadRequest(req)    
            menu.setMenuVisible(true, animated: false)
        }
    
        @IBAction func MenuShow(sender: UIBarButtonItem){
            let menu = UIMenuController.shared
            let bv = menuButton.value(forKey: "view") as? UIView
            menu.setTargetRect(bv!.frame, in:view)
    
            menu.setMenuVisible(true, animated: true)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 2017-03-04
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      相关资源
      最近更新 更多