ios - 从另一个类 Swift 调用一个类的函数

标签 ios swift xcode6 containers

我有一个 View Controller ,它包含两个容器。第一个容器嵌入了具有 2 个按钮的 FirstViewController,第二个容器嵌入了具有 webview 的 PreviewViewController。我想在该 Webview 中加载 pdf。我已经拿走了webview的outlet。 ViewDidLoad 上的 Webview 被隐藏。现在我希望如果我单击任何按钮,则应显示 webview,并且单击 Button1 webview 应加载名为 1 的 PDF,单击 Button2 webview 应加载名为 2 的 PDF。

现在我不知道该怎么做!!这是我的代码。它给了我一个错误

unexpectedly found nil while unwrapping an Optional value

在下面给出的代码中的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 调用此函数。

PreviewViewController().showpdf(1)

但是应用程序因给出上面给出的错误而崩溃。谁能建议我如何解决这个问题?

编辑: 我在 FirstViewController 的 Button Click 的按钮单击时调用它。

@IBAction func btnSave(sender: UIButton) {

       PreviewViewController().showpdf(5)
 }

image

谢谢。

最佳答案

在我解释您的问题的一种可能的解决方案之前,我强烈建议您完成有关 iOS MVC 的完整类(class),这可能需要几天的时间,但您将能够自己轻松解决此类问题。互联网上有一个由斯坦福大学 Hegarty 教授提供的适用于 iOS8 的版本。尽管 swift 与 iOS 8 中的情况相比发生了变化,但 MVC 架构并没有改变。

您需要创建一个协议(protocol)作为按下两个按钮的操作的委托(delegate),我们将其称为PDFProtocol。该协议(protocol)应该有 1 个方法,例如 showPDF(id:String)

您的主视图 Controller 应该实现PDFProtocol。现在准备segue中的主视图 Controller 应该将自己设置为第一个 View Controller 的pdfDelegate,并且它应该保留指向预览 View Controller 的指针,如下所示:

if let t = targetViewController as? FirstViewController {
    t.pdfDelegate = self
} else if let t = targetViewController as? PreviewViewController {
    self.previewViewController = t
}

第一个 View Controller 应该有一个 pdfDelegate 变量:

var pdfDelegate: PDFProtocol?

当您按下按钮时,应该对委托(delegate)调用适当的操作,如下所示:

guard delegate = pdfDelegate else {
    AssertFail("no delegate found")
    return
}
delegate.showPDF("myfirstpdf")

主视图 Controller 应该实现 showPDF(id:String) 方法,如下所示:

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

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

关于ios - 从另一个类 Swift 调用一个类的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35957447/

相关文章:

ios - ipad mini 电话号码问题

iOS推送通知: how to store push notification payload when application is kill or terminate in swift?

swift - 动态 TableView 不显示来自 API 调用的带有 JSON 数据的文本

android - 同时接入WiFi局域网(无网关)和移动网络

ios - 从嵌入式 View Controller 执行父 segue

iphone - 2 个库中的 Objective-C 链接器错误

ios - cocoa touch 框架 Assets 在应用程序项目中不可见

带有 YouTube v3 API 和 youtube-ios-player-helper 的 iOS 应用无法自动播放视频

ios - 从回调中调用 UiViewController

ios - NSUserDefaults 类的问题