从另一个类Swift

时间:2016-03-12 12:08:32

标签: ios swift xcode6 containers

我有一个视图控制器,它包含两个容器。 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)
 }

image

感谢。

1 个答案:

答案 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)
}  

就是这样。我直接在这里输入代码而不试图编译它,所以要小心拼写错误!