web-dev-qa-db-fra.com

Comment puis-je créer des liens dans une vue Web ouverte dans un safari Xcode?

J'ai une vue Web dans mon application et j'aimerais que tous les liens de la vue Web s'ouvrent dans safari au lieu de la vue Web elle-même.

Je suis en train de coder l'application dans Swift et j'ai déjà eu quelques réponses pour objective-c mais aucune pour Swift.

Est-ce que quelqu'un sait comment je peux m'y prendre?

12
Kian Cross

Cela se fait essentiellement de la même manière dans Swift et dans Obj-C:

Tout d’abord, déclarez que votre contrôleur de vue est conforme à UIWebViewDelegate

class MyViewController: UIWebViewDelegate

Puis implémentez webViewShouldStartLoadingWithRequest:navigationType: dans votre View Controller:

// Swift 1 & 2
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    switch navigationType {
    case .LinkClicked:
        // Open links in Safari
        UIApplication.sharedApplication().openURL(request.URL)
        return false
    default:
        // Handle other navigation types...
        return true
    }
}

// Swift 3
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    switch navigationType {
    case .linkClicked:
        // Open links in Safari
        guard let url = request.url else { return true }

        if #available(iOS 10.0, *) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
        } else {
            // openURL(_:) is deprecated in iOS 10+.
            UIApplication.shared.openURL(url)
        }
        return false
    default:
        // Handle other navigation types...
        return true
    }
}

Enfin, définissez votre délégué UIWebView, par exemple, dans viewDidLoad ou dans votre story-board:

webView.delegate = self
42
Ronald Martin

Mis à jour pour Swift 3

func webView(_: UIWebView, shouldStartLoadWith: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == UIWebViewNavigationType.linkClicked {
        UIApplication.shared.open(shouldStartLoadWith.url!, options: [:], completionHandler: nil)
        return false
    }
    return true
}
7
Femi Loki

Vous devez implémenter la méthode webViewShouldStartLoadingWithRequest:navigationType sur le délégué de votre vue Web et rechercher les liens que vous souhaitez ouvrir dans Safari. Si vous les envoyez au système d'exploitation avec [[UIApplication sharedApplication]openURL:], ils s'ouvriront dans Safari.

3
jefflovejapan

Mis à jour pour Swift 4.2

func webView(_: UIWebView, shouldStartLoadWith: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
    if navigationType == UIWebView.NavigationType.linkClicked {
        UIApplication.shared.open(shouldStartLoadWith.url!, options: [:], completionHandler: nil)
        return false
    }
    return true
}
0
Cesar Bielich