2016-07-05 19 views
5

Mam aplikację, która aktualnie korzysta z widoku WWW, a po kliknięciu niektórych linków w widoku internetowym otwiera te łącza w Safari. Teraz chcę zaimplementować Safari View Controller (SVC) zamiast uruchamiać go w aplikacji Safari. Zrobiłem badania i spojrzałem na przykłady na SVC; jednak wszystko, co widzę, to te, które otwierają SVC od kliknięcia przycisku. Czy ktoś ma jakieś sugestie, na które mogę się przyjrzeć lub spróbować?Jak otworzyć kontroler Safari View z podglądu strony internetowej (szybka)

Oto niektóre z moich kodu:

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

Odpowiedz

8

Jeśli jestem zrozumienia poprawnie ładujesz stronę na WebView, który ma pewne powiązania teraz, gdy użytkownik kliknie link, który chcesz otworzyć tę stronę w SVC. Możesz wykryć kliknięcie linku w widoku internetowym, używając następującej metody delegowania, a następnie od tego momentu otwórz SVC.

EDIT

podstawie edytowanej pytaniem widzę, że nie wzywają showLinksClicked func, można nazwać tę funkcję I zostały zaktualizowane w następujący kod i powinno działać.

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

Używam kodu podobnego do tego i działa. Jednak otwiera kliknięte łącza w rzeczywistej aplikacji Safari, gdzie chcę tylko otworzyć kontroler Safari View w mojej własnej aplikacji. @Bhumit Mehta – beginnercoder

+0

@beginnercoder Czy możesz edytować swoje pytanie za pomocą kodu, którego używasz? –

+0

@beginnercoder Mam zaktualizowaną odpowiedź, utworzyłeś funkcję, ale nie dzwoniłeś. –

5

Ten fragment kodu pozwoli Ci to zrobić.

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

może trzeba dodać to do góry klasy także:

import SafariServices 
+0

powinno to być po prostu dodane do mojego obecnego kodu? Czy mogę umieścić go tam zamiast niektórych mojego kodu? Jeśli dodaję go tam, nic się nie dzieje – beginnercoder

+0

Będziesz musiał umieścić go w swojej funkcji viewDidLoad lub viewWillAppear. W mojej aplikacji jest on dołączony do przycisku, więc po kliknięciu pojawia się strona na safari. – onemillion

+0

OK, zobacz Nie mam przycisku, z którym jest połączony. Chcę, aby działała ona na SVC, gdy niektóre linki w aplikacji są kliknięte. (np. Kontakt, O nas, itp.) Mój webview dzwoni do strony z tymi linkami, więc nie mam kontroli nad początkowym kodem strony – beginnercoder

1

Wykonaj czynności:

na swojej pliku sterownika (np ViewController.swift.) SafarriServices importowych.

import SafariServices 

Więc gdzie chcesz otworzyć link napisać

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

Dla Swift 3:

pierwszy, SafariServices importu i zintegrować delegata w swojej klasie:

import SafariServices 

class YourViewController: SFSafariViewControllerDelegate { 

Następnie , aby otworzyć Safari z określonym adresem URL:

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

I teraz można wdrożyć zwrotnego delegata do odwołania safari, gdy użytkownik jest gotowy:

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