2016-07-05 40 views
5

Ho un'app che utilizza attualmente una visualizzazione Web e quando determinati collegamenti vengono cliccati nella visualizzazione Web, apre quei collegamenti in Safari. Ora voglio implementare Safari View Controller (SVC) invece di avviarlo all'app Safari. Ho svolto ricerche e ho esaminato esempi sulla SVC; tuttavia, tutto quello che vedo sono quelli che aprono SVC dal clic di un pulsante. Qualcuno ha qualche suggerimento da darmi o da provare?Come aprire Safari View Controller da una Webview (swift)

Ecco alcuni del mio codice:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { 
    if navigationType == UIWebViewNavigationType.LinkClicked { 
     let host = request.URL!.host!; 
     if (host != "www.example.com"){ 
      return true 
     } else { 
      UIApplication.sharedApplication().openURL(request.URL!) 
      return false 
     } 
    return true 

} 

func showLinksClicked() { 

    let safariVC = SFSafariViewController(URL: NSURL(string: "www.example.com")!) 
    self.presentViewController(safariVC, animated: true, completion: nil) 
    safariVC.delegate = self } 

func safariViewControllerDidFinish(controller: SFSafariViewController) { 
    controller.dismissViewControllerAnimated(true, completion: nil) 
} 

risposta

8

Se sto capendo correttamente si sta caricando una pagina sul WebView che ha alcuni collegamenti ora quando l'utente fa clic su link che vuoi aprire quelle pagine in SVC. È possibile rilevare il clic del collegamento nella visualizzazione Web utilizzando il seguente metodo delegato e quindi aprire SVC da lì.

EDIT

Sulla base di domanda modificato posso vedere che non sta chiamando showLinksClicked func, è possibile chiamare questa funzione come ho aggiornato nel seguente codice e dovrebbe funzionare.

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { 
    if navigationType == UIWebViewNavigationType.LinkClicked { 
     self.showLinksClicked() 
     return false 

    } 
    return true; 
} 


func showLinksClicked() { 

    let safariVC = SFSafariViewController(URL: NSURL(string: "www.example.com")!) 
    self.presentViewController(safariVC, animated: true, completion: nil) 
    safariVC.delegate = self 
} 

func safariViewControllerDidFinish(controller: SFSafariViewController) { 
    controller.dismissViewControllerAnimated(true, completion: nil) 
} 
+0

Io uso un codice simile a questo, e funziona. Tuttavia apre i link cliccati nell'app Safari, dove voglio solo aprire un controller di Safari View all'interno della mia app. @Bhumit Mehta – beginnercoder

+0

@beginnercoder Puoi modificare la tua domanda con il codice che stai utilizzando? –

+0

@beginnercoder Ho aggiornato la mia risposta, hai creato la funzione ma non la chiamavi. –

5

Questo pezzo di codice vi permetterà di fare questo.

let safariVC = SFSafariViewController(URL: NSURL(string: "https://www.google.co.uk")!) 
self.presentViewController(safariVC, animated: true, completion: nil) 
safariVC.delegate = self 

Potrebbe essere necessario aggiungere questo alla parte superiore della classe così:

import SafariServices 
+0

Se questo basta aggiungere sul mio codice attuale? O lo metto lì invece di un po 'del mio codice? Se lo aggiungo semplicemente non accade nulla di diverso – beginnercoder

+0

Dovrai metterlo nella funzione viewDidLoad o viewWillAppear. Nella mia applicazione questo è collegato ad un pulsante così quando lo fai clic la pagina appare in safari. – onemillion

+0

Ok, guarda che non ho un pulsante a cui è collegato. Sto volendo che opein il SVC quando si fa clic su alcuni collegamenti nell'app. (es: Contattaci, Chi siamo, ecc.) La mia webview chiama un sito Web con questi collegamenti in modo da non avere il controllo del codice iniziale del sito web – beginnercoder

1

Seguire le istruzioni:

Sul file di controllo (per esempio ViewController.swift.) SafarriServices importazione.

import SafariServices 

Poi in cui si desidera aprire il collegamento in scrittura

let controller = SFSafariViewController(URL: NSURL(string: "https://www.google.co.uk")!) 
self.presentViewController(controller, animated: true, completion: nil) 
controller = self 
5

Per Swift 3:

primo luogo, SafariServices importare e integrare il delegato nella tua classe:

import SafariServices 

class YourViewController: SFSafariViewControllerDelegate { 

Poi , per aprire Safari con l'url specificato:

let url = URL(string: "http://www,google.com")! 
let controller = SFSafariViewController(url: url) 
self.present(controller, animated: true, completion: nil) 
controller.delegate = self 

E ora è possibile implementare la richiamata delegato di respingere safari quando l'utente ha terminato:

func safariViewControllerDidFinish(_ controller: SFSafariViewController) { 
    controller.dismiss(animated: true, completion: nil) 
}