2017-02-08 3 views
4

Я сделал приложение iOS с Xcode и Swift.Xcode, Swift; Обнаружить гиперссылку нажмите в UIWebView

Я хочу открыть определенные гиперссылки в браузере Safari, там есть другие в WebView.

Чтобы достичь этого, мне нужно будет проверить, когда нажимается гиперссылка.

Это код, который я до сих пор:

// 
// PushViewController.swift 
// App 
// 
// 

import UIKit 
class PushViewController: UIViewController, UIWebViewDelegate { 
    @IBOutlet var openpushmessage: UIWebView! 

    var weburl:String = "http://www.example.com" 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let url: NSURL = NSURL(string: weburl)! 
     let requestURL: NSURLRequest = NSURLRequest(URL: url) 
     openpushmessage.loadRequest(requestURL) 
    } 
    override func webView(_ webView: UIWebView, shouldStartLoadWithRequest request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool { 
     if navigationType == .linkClicked 
     { 
      print("You clicked a hypelink!") 
     } 
     return true 
    } 
} 

Код в viewDidLoad() открывает загружает основной URL (http://www.example.com) с моего сервера. Это прекрасно работает.

override fun webView[…] следует определить, нажата ли гиперссылка, а затем print("You clicked a hypelink!").

Но, к сожалению, я получаю следующие ошибки:

one error and one warning for my code

Что я делаю неправильно? Как избавиться от этих ошибок?

+0

Вы пробовали очистить проект? Также удалите ключевое слово переопределения. – Priyal

+0

@Priyal Хорошо, я удалил 'override', и я очистил проект, но все тот же. Я теперь дополнительно получаю: «Использование необъявленного типа« URLRequest » – user7128548

+0

Я скопировал ваш точный код. Решено предложения, после чего окончательный код является: 'FUNC WebView (_ Webview: UIWebView запрос shouldStartLoadWith: URLRequest, navigationType: UIWebViewNavigationType) -> Bool { если navigationType == .linkClicked { печать (" Вы нажали hypelink ! ") } return true }' и он не дает никаких ошибок или предупреждений. Я использую ** swift3 **, поэтому пришлось разрешить предупреждения. – Priyal

ответ

4

Это рабочий раствор (Xcode 7.3.1 и Swift 2,2):

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { 

    if request.URL?.query?.rangeOfString("target=external") != nil { 
     if let url = request.URL { 
      UIApplication.sharedApplication().openURL(url) 
      return false 
     } 
    } 
    return true 
} 

Большое спасибо danhhgl from freelancer.com!

0

Я думаю, что вы можете решить с помощью этого кода:

function reportBackToObjectiveC(string) 
{ 
var iframe = document.createElement("iframe"); 
iframe.setAttribute("src", "callback://" + string); 
document.documentElement.appendChild(iframe); 
iframe.parentNode.removeChild(iframe); 
iframe = null; 
} 

var links = document.getElementsByTagName("a"); 
for (var i=0; i<links.length; i++) { 
links[i].addEventListener("click", function() { 
    reportBackToObjectiveC("link-clicked"); 
}, true); 
} 

в ИО код:

if ([[[request URL] scheme] isEqualToString:@"callback"]) { 
[self setNavigationLeavingCurrentPage:YES]; 
return NO; 
} 

Подробнее вы можете проверить с here:

6

пожалуйста, попробуйте

для swift 3.0

public func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool 
     { 
     if navigationType == .linkClicked 
     { 

      } 
      return true; 
     } 

быстры 2,2

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

     } 
     return true; 
    } 
+0

Я получаю 'Extraneous '_' в параметре: 'webView' не имеет имени аргумента ключевого слова' и' Binary operator '==' не может быть применен к операндам типа 'UIWebViewNavigationType' и '_''. – user7128548

+0

Возможно, это потому, что я использую Xcode 7.3.1 и Swift 2.2? – user7128548

+0

Код, который я вставил, является быстрым 3.0 –