我有一个当前正在使用webview的应用,当在webview中点击某些链接时,它会在Safari中打开这些链接。我现在想要实现Safari视图控制器(SVC),而不是将其启动到Safari应用程序。我做过研究,看过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)
}
答案 0 :(得分:14)
如果我正确理解您正在加载webview上的页面,当用户点击链接时您现在可以在SVC中打开这些页面。您可以使用以下委托方法检测webview中的链接点击,然后从那里打开SVC。
修改
根据编辑过的问题我可以看到你没有调用showLinksClicked func,你可以调用这个函数,因为我已经在下面的代码中更新了它应该可以工作。
<textField pattern="MMM d, yyyy h:mm:ss a z">
<reportElement x="0" y="1" width="280" height="21" isRemoveLineWhenBlank="true" uuid="3f452153-41b0-4296-84b9-5a78825a18dc"/>
<textElement verticalAlignment="Middle">
<font isItalic="true"/>
</textElement>
<textFieldExpression><![CDATA["Report Generated on: "+new java.util.Date()]]></textFieldExpression>
</textField>
答案 1 :(得分:13)
对于Swift 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
现在,您可以实现委托回调以在用户完成时解除safari:
func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
controller.dismiss(animated: true, completion: nil)
}
答案 2 :(得分:8)
这段代码可以让你这样做。
let safariVC = SFSafariViewController(URL: NSURL(string: "https://www.google.co.uk")!)
self.presentViewController(safariVC, animated: true, completion: nil)
safariVC.delegate = self
您可能还需要将其添加到班级的顶部:
import SafariServices
答案 3 :(得分:2)
按照以下步骤操作:
在您的控制器文件(例如ViewController.swift)上导入SafarriServices。
import SafariServices
然后在哪里打开链接写
let controller = SFSafariViewController(URL: NSURL(string: "https://www.google.co.uk")!)
self.presentViewController(controller, animated: true, completion: nil)
controller = self
答案 4 :(得分:1)
Swift 4解决方案
第1步:
在您的课程中导入Safari服务
import SafariServices
第2步:
使用您的View Controller导入SFSafariViewControllerDelegate
class ViewController: UIViewController,SFSafariViewControllerDelegate {...}
第3步:
创建一个功能以打开Safari View Controller。
func openSafariVC() {
let safariVC = SFSafariViewController(url: NSURL(string: "https://www.google.com")! as URL)
self.present(safariVC, animated: true, completion: nil)
safariVC.delegate = self
}
func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
controller.dismiss(animated: true, completion: nil)
}
步骤4:
调用函数openSafariVC
openSafariVC()
注意:不要忘记在视图中添加导航控制器 控制器。
现在您的SafariVC可以在不使用 UIWebView Oe WKWebView
的情况下打开应用程序中的链接了。答案 5 :(得分:0)
Swift 4.2
这是您可以在应用程序中打开Safari浏览器的方式。
import SafariServices
无论何时要打开,如
@IBAction func btnOpenWebTapped(_ sender: UIButton) {
self.openWeb(contentLink: "https://www.google.com")
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
self.openWeb(contentLink: "https://www.google.com")
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.openWeb(contentLink: "https://www.google.com")
}
通过编写自定义函数,您可以自定义SFSafariViewController, preferredBarTintColor, preferredControlTintColor, dismissButtonStyle, barCollapsingEnabled
func openWeb(contentLink : String){
let url = URL(string: contentLink)!
let controller = SFSafariViewController(url: url)
controller.preferredBarTintColor = UIColor.darkGray
controller.preferredControlTintColor = UIColor.groupTableViewBackground
controller.dismissButtonStyle = .close
controller.configuration.barCollapsingEnabled = true
self.present(controller, animated: true, completion: nil)
controller.delegate = self
}
最后也是最重要的一点是不要忘记将SFSafariViewController
的委托与您的视图控制器绑定。您可以通过下面提到的extension
代码来做到这一点。
extension YourViewController: SFSafariViewControllerDelegate
{
func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
controller.dismiss(animated: true, completion: nil)
}
}
快乐的编码,谢谢:)
答案 6 :(得分: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)
}
}