【问题标题】:How to open another View from links within UIWebview in Swift 3?如何从 Swift 3 中的 UIWebview 中的链接打开另一个视图?
【发布时间】: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

标签: ios swift3 uiwebview xcode8


【解决方案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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多