从另一个类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

将数组从另一个类的构造函数传递给类函数

python - kivy:从另一个类调用函数

从另一个 .swift 文件调用 ViewController 函数

使用线程从另一个成员函数调用一个成员函数

Actionscript:从另一个类的函数中找不到变量