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 中为零