12

現在 Web ビューを使用しているアプリがあり、Web ビューで特定のリンクをクリックすると、それらのリンクが Safari で開きます。Safari アプリを起動する代わりに、Safari ビュー コントローラー (SVC) を実装したいと考えています。私は調査を行い、SVC の例を見てきました。ただし、ボタンをクリックするだけで SVC を開くものしか表示されません。私が見たり試したりする提案はありますか?

これが私のコードの一部です:

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

7 に答える 7

17

私が正しく理解している場合、ユーザーがリンクをクリックすると、特定のリンクを持つ webview にページが読み込まれ、SVC でそれらのページを開くことができます。次のデリゲート メソッドを使用して webview でリンクのクリックを検出し、そこから SVC を開くことができます。

編集

編集された質問に基づいて、 showLinksClicked func を呼び出していないことがわかります。次のコードで更新したので、この関数を呼び出すことができ、動作するはずです。

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: URL(string: "www.google.com")!)
    present(safariVC, animated: true, completion: nil)
    safariVC.delegate = self
}

func safariViewControllerDidFinish(controller: SFSafariViewController) {
    controller.dismissViewControllerAnimated(true, completion: nil)
}
于 2016-07-05T13:13:29.510 に答える
13

スウィフト 3 の場合:

まず、SafariServices をインポートし、デリゲートをクラスに統合します。

import SafariServices

class YourViewController: SFSafariViewControllerDelegate {

次に、指定した URL で Safari を開きます。

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

これで、デリゲート コールバックを実装して、ユーザーが終了したときにサファリを閉じることができます。

func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
    controller.dismiss(animated: true, completion: nil)
}
于 2016-12-22T19:12:47.357 に答える
9

このコードにより、これが可能になります。

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

これもクラスの先頭に追加する必要がある場合があります。

import SafariServices
于 2016-07-05T12:57:37.950 に答える
0
import SafariServices

class ViewController: UIViewController, SFSafariViewControllerDelegate {

 override func viewDidLoad() {
     super.viewDidLoad()
     DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
         let url = URL(string: "http://www.google.com")!
         let controller = SFSafariViewController(url: url)
         self.present(controller, animated: true, completion: nil)
         controller.delegate = self
     }
 }

 func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
     dismiss(animated: true)
 }
}
于 2020-12-21T07:15:16.147 に答える