Swift 2 - 无法在单独的 ViewController 中加载 UIWebView

Posted

技术标签:

【中文标题】Swift 2 - 无法在单独的 ViewController 中加载 UIWebView【英文标题】:Swift 2 - Cannot load UIWebView in separate ViewController 【发布时间】: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") 您是以模态方式展示新的视图控制器还是将其推送到导航堆栈上? 【参考方案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 调用时它只是不起作用

以上是关于Swift 2 - 无法在单独的 ViewController 中加载 UIWebView的主要内容,如果未能解决你的问题,请参考以下文章

Swift 致命错误:在 segue 上展开 Optional 值时意外发现 nil

self.navigationController 在 swift 中为零

Swift:NSUserDefaults 没有立即设置

向 UINavigationBar 添加搜索按钮:Swift

Swift Mapkit - 远离用户位置

(Swift) 如何为单独的 iCarousels 分配特定数量的项目?