如何从 Swift 3 中的 UIWebview 中的链接打开另一个视图?

Posted

技术标签:

【中文标题】如何从 Swift 3 中的 UIWebview 中的链接打开另一个视图?【英文标题】:How to open another View from links within UIWebview in Swift 3? 【发布时间】:2017-05-27 09:54:48 【问题描述】:

当我实现了它在浏览器上完美运行的代码时,它可以在 ios 中打开 safari 并将myapp:// 放在地址栏上,它会打开我的应用程序,但我想在点击 UIWebView 内的链接时进行操作

@IBOutlet weak var webView: UIWebView!
override func viewDidLoad() 
    super.viewDidLoad()
    let setURL=URL(string:"https://myapp.com/")
    let setURLRequest=URLRequest(url:setURL!)
    webView.loadRequest(setURLRequest)


这是我将网站加载到 webview 的代码并添加了URL TYPE >item0->myapp

item0->URL Scheme->myapp

当我添加到链接例如< a href="myapp://"></a> 时,它不会启动另一个视图并出现错误

Appdelegate

     public func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool 
        if request.url?.scheme == "myapp" 
         // UIApplication.shared.open(request.url!, options: [:], //completionHandler: nil)
let myVC: MyAnotherController = MyAnotherController() 
self.present(myVC, animated: true)   
            return false
        
    return true

收到此错误 'AppDelegate' 类型的值没有成员 'present'"

【问题讨论】:

获取已经在屏幕上的视图控制器的引用(使用根视图控制器,如果您的应用程序有一个或任何其他规定(如果您的应用程序有)),然后调用 present 方法它。 但是即使我没有提到“UIApplication.shared.open(request.url!, options: [:], //completionHandler: nil)” 怎么可能打开 myapp 应用程序我应该怎么做做吗? 你能把你的项目上传到某个地方(最好是谷歌驱动器)并分享链接吗? 此处或您的电子邮件 ID 这取决于你。这是我的电子邮件 ID:saurabhbhatia.jmi@gmail.com 【参考方案1】:

if block 内部,您需要 return false,它应该可以工作。 通过返回 false 委托方法告诉 webView 不应该开始加载 url。

public func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool 

if request.url?.scheme == "myapp" 
    // do your work here
    UIApplication.shared.open(request.url!, options: [:], completionHandler: nil)
    //Add the below line of code to the existing code
    return false

return true

【讨论】:

我确实在 plist 文件中为 myapp 应用程序和 webview 添加了 myapp 在另一个应用程序中,我希望当我点击在另一个应用程序中 myapp 应该打开的链接时,它也无法通过设置 return false 来工作跨度> 如果我需要在同一个应用中打开另一个视图 另一个视图是什么意思? 我的意思是另一个故事板,例如单击按钮(Webview)在同一个应用程序而不是另一个应用程序上打开另一个视图 将 UIApplication.shared.open(request.url!, options: [:], completionHandler: nil) 替换为将呈现另一个视图控制器的语句。示例:让 myVC: MyViewController = MyViewController() self.present(baseVC, animated: true) 【参考方案2】:

你可以使用UIWebView委托方法optional public func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool

示例

public func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool 

    if request.url?.scheme == "myapp" 
        // do your work here
        UIApplication.shared.open(request.url, options: [:], completionHandler: nil)
    
    return true

但是你也必须在你的应用列表中提到所有的愿望方案..

使用 url 方案打开其他应用

if let url = URL.init(string: "myapp://") 
    if UIApplication.shared.canOpenURL(url) 
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
     else 
        print("scheme is missing in info.plist or invalid scheme")
    
 else 
    print("invalid url")

【讨论】:

那么我们如何启动应用程序? 是的,我在 plist 文件中进行了所有设置......我明白......这意味着根据你我需要打开 safari 并点击 url 以便应用程序可以启动 我想我想念你的问题。如果你只是想打开其他应用程序,你不必打开网络视图,只需使用这个UIApplication.shared.open(request.url, options: [:], completionHandler: nil) 并在你的信息中添加方案。列表。 谢谢 :) 实际上我是 Swift 3 IOS 应用程序开发的新手,你有没有好的教程文章,我会很感激的 它不起作用..不知道但是当我点击按钮作为链接并传递“myapp://”这个网址时【参考方案3】:

使用此代码(如果 URL 的最后一个字符包含“#”,它将起作用)。添加“#”是因为如果我们导航回最后一个屏幕,它不会打开。

网页视图中的链接(www.google.com)。

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, 
    navigationType: UIWebViewNavigationType) -> Bool 
    // request.url?.absoluteString = "www.google.com/#"
    let last = request.url?.absoluteString.last
    if last == "#" 
       //do stuff here
    
    return true

【讨论】:

以上是关于如何从 Swift 3 中的 UIWebview 中的链接打开另一个视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 3 的 UIWebview 中会话过期?

如何在 Swift 中的 UIWebView 中加载本地 PDF

如何在Swift中的UIWebView中加载URL?

从 appdelegate swift 访问 UIwebview

iOS Swift 如何从 UIWebView 将 JSON 字符串和数组或字典传递给 Javascript?

在 iOS Swift 3 中以编程方式添加 Web 视图时如何在 UIWebView 中获取响应状态代码?