2017-09-22 1 views
0

Nouveau sur Swift. J'ai une interface utilisateur simple: mettre un UINavigationBar au-dessus d'un UIWebView, et un l'élément de la barre de droite pour avoir une action qui montre un menu, pour permettre l'utilisation de choisir différentes pages à afficher dans la vue web.Le menu rapide ne s'affiche pas sur le bouton de navigation droit. Cliquez sur

Afficher le contrôleur de vue ressemble à:

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

} 

(j'ai connecté la vue Web, le bouton de la barre à l'objet de l'interface utilisateur, car viewnav j'ai essayé d'ajouter une nouvelle vue factice dans Main.storyboard ou en utilisant la navigation existante barre, les deux ont le même résultat)

L'application qui en résulte montre la page vide et quand j'appuie sur le bouton de menu, saute dans la page d'accueil d'Apple, de sorte que le code ci-dessus fonctionne comme prévu. Mais le menu ne s'affiche pas, alors qu'est-ce qui ne va pas pour le code ci-dessus?

(il y a quelques questions simular comme this, mais ils ne semblent pas résoudre le problème)

Répondre

0

Cette answer donne la solution:

override var canBecomeFirstResponder: Bool { 
    return true 
} 

Et ajoutez cette ligne à la viewDidLoad méthode

view.becomeFirstResponder() 

Version complète:

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