2016-03-12 102 views
0

我有一个视图控制器,它包含两个容器。第一个容器嵌入了FirstViewController,它有两个按钮,第二个容器嵌入了带有webview的PreviewViewController。我想在该Webview中加载PDF。我已经采取了webview的出路。在ViewDidLoad Webview被隐藏。现在我想如果我点击任何按钮,webview sholud显示,我点击Button1的WebView应加载PDF命名为1,并通过单击Button2 webview应加载PDF命名2.从另一个类调用一个类的函数Swift

现在我不知道要做到这一点!这是我的代码。这是给我

意外发现零的错误,而其中下面给出的代码上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) 
      } 
     }   
    } 

现在,我从FirstViewController on buttonclick调用此函数。

PreviewViewController().showpdf(1) 

但是,由于上面给出的错误,应用程序崩溃。任何人都可以建议我怎么解决这个问题?

编辑: 我打电话它按钮单击FirstViewController的按钮单击。

@IBAction func btnSave(sender: UIButton) { 

     PreviewViewController().showpdf(5) 
} 

image

感谢。

+0

为什么你在视图控制器中有几个视图控制器? –

+0

我有两个容器内主控制器..和两个容器内嵌两个ViewControllers @ Tim Vermeulen –

+0

你必须调用PreviewViewController实例,而不是它的类..给我们多一点的代码在哪里以及如何使用PreviewViewController – andykkt

回答

0

在我解释您的问题的一种可能的解决方案之前,我强烈建议您完成一个关于iOS MVC的完整课程,可能需要几天时间,但您可以轻松地自行解决这类问题。斯坦福大学的Hegarty教授在互联网上提供iOS8。虽然swift已经从iOS 8中改变了,但MVC架构并没有改变。

你需要的是创建一个协议作为委托按下两个按钮的动作,我们称之为PDFProtocol。这个协议应该有1个方法,例如showPDF(id:String)

你的主视图控制器应该实现PDFProtocol。现在在主视图控制器赛格瑞应该为自己作为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") 

迈那么n视图控制器应该实现showPDF(id:String)方法如下:

func showPDF(id:string) { 
    self.previewViewController.showPDF(id) 
} 

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

+0

我没有得到你.. –

+0

我试着当你告诉我..但不知道我在哪里做错了。 @Daniele Bernardini –

+0

如果你不给我更多的细节,我无法帮助你。调试你的代码,看你的变量是否被设置,以及你的函数是否被调用。 –