我有一个视图控制器,它包含两个容器。 First Container嵌入了FirstViewController,它有2个按钮,第二个Container嵌入了带有webview的PreviewViewController。我想在该Webview中加载pdf。我已经采取了webview的出口。在ViewDidLoad上隐藏了Webview。现在我希望如果我点击任何显示webview sholud的按钮,我点击Button1 webview应该加载名为1的PDF并通过点击Button2 webview应该加载名为2的PDF。
现在我不知道这样做!!这是我的代码。它给了我一个错误
在解包可选值时意外发现nil
在下面给出的代码中的webview.hidden = true
行。这是用PreviewViewController
写的。
@IBOutlet var webview: UIWebView!
func showpdf(id : Int)
{
webview.hidden = false
if id == 1
{
if let pdf = NSBundle.mainBundle().URLForResource("1", withExtension: "pdf", subdirectory: nil, localization: nil) {
let req = NSURLRequest(URL: pdf)
// let webView = UIWebView(frame: CGRectMake(30,30,self.view.frame.size.width-250,self.view.frame.size.height-250))
webview.loadRequest(req)
self.view.addSubview(webview)
}
}
else if id == 2
{
if let pdf = NSBundle.mainBundle().URLForResource("2", withExtension: "pdf", subdirectory: nil, localization: nil) {
let req = NSURLRequest(URL: pdf)
webview.loadRequest(req)
self.view.addSubview(webview)
}
}
}
现在,我在buttonclick上从FirstViewController调用此函数。
PreviewViewController().showpdf(1)
但是应用程序因上面给出的错误而崩溃了。任何人都可以建议我如何解决这个问题?
修改 我在按下ClickView按钮单击按钮时调用它。
@IBAction func btnSave(sender: UIButton) {
PreviewViewController().showpdf(5)
}
感谢。
答案 0 :(得分:0)
在我解释您的问题的一个可能的解决方案之前,我强烈建议您完成iOS MVC的完整课程,可能需要几天时间,但您可以自己轻松解决这类问题。来自斯坦福大学的Hegarty教授在互联网上有一个适用于iOS8的版本。虽然swift已经从iOS 8改变了,但MVC架构没有改变。
您需要创建协议以用作按下两个按钮的操作的委托,我们可以将其称为PDFProtocol
。该协议应该有1个方法,例如showPDF(id:String)
您的主视图控制器应该实现PDFProtocol
。现在,准备segue的主视图控制器应该将自己设置为第一个视图控制器的pdfDelegate,它应该保留一个指向预览视图控制器的指针,如下所示:
if let t = targetViewController as? FirstViewController {
t.pdfDelegate = self
} else if let t = targetViewController as? PreviewViewController {
self.previewViewController = t
}
第一个视图控制器应该有pdfDelegate的变量:
var pdfDelegate: PDFProtocol?
当您按下按钮时,应在代理上调用相应的操作,如下所示:
guard delegate = pdfDelegate else {
AssertFail("no delegate found")
return
}
delegate.showPDF("myfirstpdf")
然后,主视图控制器应该实现showPDF(id:String)
方法,如下所示:
func showPDF(id:string) {
self.previewViewController.showPDF(id)
}
就是这样。我直接在这里输入代码而不试图编译它,所以要小心拼写错误!