ios - 使用来自另一个 ViewController 的新 url 重新加载 WebView

标签 ios swift uiwebview

我在从另一个 View Controller 重新加载 UIWebiView 时遇到问题。当我尝试发送新的 url 并重新加载它时,应用程序因 webview 为 nil 而崩溃。

我制作了一个简单的测试应用程序来缩小我的问题范围,现在它是一个简单的页面,带有一个显示 google 的 webivew 和一个 View 上的按钮。按下按钮时,它会以模态方式显示另一个页面。该页面只有一个按钮,当按下该按钮时,它会自行消失并在第一个 View 中调用一个函数,要求使用新的 url 刷新它。这是我的代码:

class ViewController: UIViewController {

    @IBOutlet var webView: UIWebView!
    override func viewDidLoad() {
        super.viewDidLoad()

        let urlRequest = NSURLRequest(URL: NSURL(string: "https://www.google.com")!)
        webView.loadRequest(urlRequest)
    }

    @IBAction func showViewPressed(sender: AnyObject) {
        let showView = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("showView")
        self.presentViewController(showView, animated: true, completion: nil)
    }

    func reloadWebView(newURL: String) {
        let urlRequest = NSURLRequest(URL: NSURL(string: newURL)!)
        webView.loadRequest(urlRequest)
    }

}

对于第二个 View :

class ReloadViewController: UIViewController {

    @IBAction func buttonPressed(sender: AnyObject) {
        dismissViewControllerAnimated(true, completion: {
            ViewController().reloadWebView("https://www.yahoo.com")
        })
    }

}

它因 fatal error 而崩溃:在展开可选值时意外发现 nil

最佳答案

好吧,看来在我提出问题之前,我花了几个小时试图找到一个无济于事的解决方案。然后在我发布一个问题后 5 分钟,我认为我永远找不到解决方案……我找到了。所以我找到了一个用于 TableView 的解决方案 here这也恰好适用于 WebView 。因此,对于将来寻找同样东西的任何人,这是我所做的:

class ViewController: UIViewController {

    @IBOutlet var webView: UIWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let urlRequest = NSURLRequest(URL: NSURL(string: "https://www.google.com")!)
        webView.loadRequest(urlRequest)

        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(reloadWebView), name:"reload", object: nil)

    }

    @IBAction func showViewPressed(sender: AnyObject) {
        let showView = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("showView")
        self.presentViewController(showView, animated: true, completion: nil)
    }

    func reloadWebView() {
        let urlRequest = NSURLRequest(URL: NSURL(string: "https://yahoo.com")!)
        webView.loadRequest(urlRequest)
    }

}

对于第二个 View :

class ReloadViewController: UIViewController {

    @IBAction func buttonPressed(sender: AnyObject) {
        dismissViewControllerAnimated(true, completion: {
            NSNotificationCenter.defaultCenter().postNotificationName("reload", object: nil)
        })
    }

}

而且效果很好!

关于ios - 使用来自另一个 ViewController 的新 url 重新加载 WebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44091235/

相关文章:

ios - 下载 header 为 "Authorization"的文件时出现 400 错误

ios - SWRevealViewController 隐藏后视 Controller

ios - 如何使用照片框架获取引用网址的文件名?

swift - 错误枚举 - 案例的通用参数

javascript - 如何控制UIWebView的javascript

ios - 是否接受 UIWebView 中的 cookie?

ios - 如何使用 iOS SDK 获取 Quickblox 中的用户 ID?

ios - 快捷按钮概述

regex - Swift 3 replacingOccurrences 正则表达式

ios - 如何使用导航 Controller 作为我的 UIWebView [Xcode] 的导航?