如何在不允许站点时显示 UIAlertController,使用 decidePolicyFor



我正在浏览 Paul Hudson 的 Hacking with Swift 教程,并试图让WebView在不允许站点时显示UIAlertController。目前,允许的站点来自硬编码数组。

我已经尝试在调用decisionHandler(.cancel)之前插入以下内容,并将其添加到if host.contains(website)语句的末尾:

let alert = UIAlertController(title: "Heads Up!", message: "This URL is blocked.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .cancel))
present(alert, animated: true)

代码如下:

var websites = ["apple.com", "hackingwithswift.com"]
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
let url = navigationAction.request.url
if let host = url?.host {
for website in websites {
if host.contains(website) {
decisionHandler(.allow)
return
}
}
}
decisionHandler(.cancel)
}

我知道访问者甚至只能访问两个网站 - 但如果它不适用,那么在保罗的网站上不会是一个挑战。你可以在这里查看我这个项目的整个存储库:https://github.com/andrewlundy/hacking-with-swift/tree/master/Project4

添加UITableViewController作为初始ViewController后,在列表中显示网站,然后检查当前站点是否在托管WKWebViewViewController中,其属性为websites,我能够提出一个基本的解决方案。

通过在UITableViewController中使用didSelectRowAt,您可以看到,如果用户点击的网站不在允许的网站上,它现在将弹出警报并让用户知道该网站已被阻止。

我相信这可以改进,这样你就不必在每个ViewController中更新两个websites属性,但这适用于 Hacking with Swift 教程。如果您可以提高效率,请添加此答案。

新的 TableViewController 类:

class TableViewController: UITableViewController {
let webView = ViewController()
var websites = ["apple.com", "hackingwithswift.com", "facebook.com"]

override func viewDidLoad() {
super.viewDidLoad()
print(webView.websites)
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return websites.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "WebsiteCell", for: indexPath)
cell.textLabel?.text = websites[indexPath.row]
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let currentSite = websites[indexPath.row]
webView.currentSite = currentSite
if webView.websites.contains(currentSite) {
navigationController?.pushViewController(webView, animated: true)
} else {
let alert = UIAlertController(title: "Heads Up!", message: "This URL is blocked", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { (UIAlertAction) in
self.navigationController?.popViewController(animated: true)
}))
present(alert, animated: true)
}
}
}

相关内容

  • 没有找到相关文章