【问题标题】:Swift 2 - Cannot load UIWebView in separate ViewControllerSwift 2 - 无法在单独的 ViewController 中加载 UIWebView
【发布时间】:2016-02-12 05:09:24
【问题描述】:

我遇到了一个奇怪的问题 - 我无法在单独的视图控制器的背景中加载 UIWebView。具体来说,我有一个带有按钮的UITableViewCell,用于在其后面的视图控制器中加载 UIWebView。但是,我不断收到错误“在展开可选值时发现 nil”...

这是我的代码:

func loadWebView(URLString:String) {

    print("the urlstring is \(URLString)")
    let theRequestURL = NSURL (string: URLString)
    let theRequest = NSURLRequest (URL: theRequestURL!)

    fullScreenWebView.loadRequest(theRequest)


}

print 语句产生正确的 URL,所以问题不在于 URL 字符串没有被传递。

此外,如果我从定义它的视图控制器加载UIWebView,它会完美运行。我猜这个问题与调用 loadWebView() 时不是正确的视图控制器有关......我读了 Unable to display URL in WebView from another view controller,这有点帮助。

我做错了什么?

【问题讨论】:

  • 您能告诉我们您是如何通过UIWebView 保留UIViewController 的引用的吗?必须初始化fullScreenWebView
  • 你到底是什么意思?我做的一切都正常,除了我只是从另一个地方调用 UIWebview
  • 我的意思是,您已经在 控制器 A 中初始化了 Web 视图,但是您在 控制器 B 中调用了loadRequest。那么如何将视图控制器的引用传递给 Controller B
  • 哦,好吧,我在做 SecondViewController().loadWebView("URL STRING HERE")
  • 您是以模态方式展示新的视图控制器还是将其推送到导航堆栈上?

标签: ios swift uitableview uiwebview


【解决方案1】:

当使用

调用loadRequest

SecondViewController().loadWebView("URL STRING HERE")

您正在创建 SecondViewController 的新实例,而不是使用已经加载的实例。

您需要在已在内存中的实例上调用loadRequest,并初始化您的UIWebView

为此,您可以获得前一个视图控制器的引用并调用方法来加载您的请求

假设 SecondViewController 是带有 UIWebView 的控制器

在顶部视图控制器中添加这个(带有UITableView 的控制器)

func loadWebView(URLString:String) {

    print("the urlstring is \(URLString)")
    let theRequestURL = NSURL (string: URLString)
    if let theRequest = NSURLRequest (URL: theRequestURL!) {

        //In case you push view controller on a navigation stack
        let vc : SecondViewController = self.backViewController()

        vc.loadWebView(theRequest)
    }
}

//Get previous view controller on navigation stack
func backViewController() -> UIViewController? {
    if let stack = self.navigationController?.viewControllers {
        for(var i=stack.count-1;i>0;--i) {
            if(stack[i] == self) {
                return stack[i-1]
            }
        }
    }
    return nil
}

现在在你的 SecondViewController 中,添加

func loadWebView(request : NSURLRequest) {

    // Replace customWebView with the reference variable of your `UIWebView`
    customWebView.loadRequest(request)
}

【讨论】:

  • 仍然出现同样的错误。我试图从 tableviewcell 调用 webview。这有什么区别吗?
  • 您能否更新您的问题以包含您如何从表格视图单元格调用它的代码。
【解决方案2】:

您收到此错误的原因是您强制解包 nil 值。我总是建议使用 if let 语句解开可空值:

func loadWebView(URLString:String) {

    print("the urlstring is \(URLString)")
    if let theRequestURL = NSURL (string: URLString) {
        let theRequest = NSURLRequest (URL: theRequestURL!)

        fullScreenWebView.loadRequest(theRequest)
    }
}

并非每个字符串都可以转换为 URL,这就是 NSURL(string:) 返回可选值的原因。我会检查为什么你的 URLString 不能被解析成一个 URL

【讨论】:

  • 对,但我知道这些网址有效。如问题中所述,从视图控制器调用时,webview 工作正常。从 tableviewcell 调用时它只是不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
相关资源
最近更新 更多