【问题标题】:Xcode, Swift; Detect hyperlink click in UIWebViewXcode,斯威夫特;检测 UIWebView 中的超链接点击
【发布时间】:2017-06-25 18:34:22
【问题描述】:

我用 Xcode 和 Swift 制作了一个 iOS 应用程序。

我想在 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!")。

但不幸的是,我收到以下错误:

我做错了什么?如何摆脱这些错误?

【问题讨论】:

  • 您尝试清理项目了吗?同时删除 override 关键字。
  • @Priyal 好的,我删除了override 并清理了项目,但还是一样。我现在还得到:Use of undeclared type 'URLRequest'
  • 我复制了你的确切代码。解决了最终代码为:func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool { if navigationType == .linkClicked { print("You clicked a hypelink!") } return true } 之后的建议,并且它没有给出任何错误或警告。我正在使用 swift3 所以必须解决警告。
  • 您使用的是哪个 swift 版本?
  • 我还在使用 Swift 2。知道我能做什么吗?

标签: ios xcode hyperlink uiwebview shouldstartload


【解决方案1】:

请尝试

对于 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;
    }

【讨论】:

  • 我收到了Extraneous '_' in parameter: 'webView' has no keyword argument name 和Binary operator '==' cannot be applied to operands of type 'UIWebViewNavigationType' and '_'。
  • 可能是因为我使用的是 Xcode 7.3.1 和 Swift 2.2?
  • 这似乎是问题所在。你知道如何将其转换为 Swift 2.2 吗?
【解决方案2】:

这是可行的解决方案(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!

【讨论】:

    【解决方案3】:

    我想你可以用这段代码解决:

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

    在ios代码中:

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

    更多详情您可以通过here查看:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多