从另一个类Swift调用一个类的函数
Posted
技术标签:
【中文标题】从另一个类Swift调用一个类的函数【英文标题】:Calling Function of one class from another class Swift 【发布时间】:2016-03-12 12:08:32 【问题描述】:我有一个视图控制器,它包含两个容器。第一个容器嵌入了具有 2 个按钮的 FirstViewController,第二个容器嵌入了具有 webview 的 PreviewViewController。我想在那个 Webview 中加载 pdf。我已经采取了webview的出口。在 ViewDidLoad Webview 上是隐藏的。现在我想要,如果我点击任何应该显示 webview 的按钮,然后点击 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)
但应用程序因上面给出的错误而崩溃。谁能建议我如何解决这个问题?
编辑: 我在 FirstViewController 的 Button Click 按钮单击时调用它。
@IBAction func btnSave(sender: UIButton)
PreviewViewController().showpdf(5)
谢谢。
【问题讨论】:
为什么一个视图控制器中有多个视图控制器? 我在主控制器中有两个容器.. 两个容器嵌入了两个 ViewControllers @Tim Vermeulen 你必须调用 PreviewViewController 实例,而不是它的类。给我们更多的代码,你在哪里以及如何使用 PreviewViewController @RiddhiShah 为什么不将这些“容器”添加到原始视图控制器中?没有必要为所有东西都设置一个单独的控制器。 我已经看到了类似的问题。答案只能是,阅读或观看有关 ios 中委托和 MVC 的教程。 【参考方案1】:在我解释您的问题的一种可能解决方案之前,我强烈建议您完成有关 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)
就是这样。我直接在这里输入代码,没有尝试编译,所以要小心拼写错误!
【讨论】:
我按照你告诉我的那样尝试了......但不知道我在哪里做错了。 @Daniele Bernardini 如果你不给我更多细节,我帮不了你。调试你的代码,看看你的变量是否被设置,你的函数是否被调用。 这有点超出我的承诺 :-) 看看这个***.com/help/how-to-ask以上是关于从另一个类Swift调用一个类的函数的主要内容,如果未能解决你的问题,请参考以下文章
Swift:如何从另一个类 X 更新 UILabel:UIButton