Swift:如何从我的应用程序打开本地pdf到iBooks

时间:2015-01-15 08:07:13

标签: ios objective-c xcode swift

我以前是客观的。以下目标C中的代码工作正常:

英寸ħ

@property (retain)UIDocumentInteractionController *docController;

和.m

    NSString *path = [[NSBundle mainBundle] pathForResource:@"book" ofType:@"pdf"];
NSURL *targetURL = [NSURL fileURLWithPath:path];


docController = [UIDocumentInteractionController interactionControllerWithURL:targetURL];

if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"itms-books:"]]) {

    [docController presentOpenInMenuFromRect:CGRectZero inView:self.view animated:YES];
    NSLog(@"iBooks installed");

} else {

    NSLog(@"iBooks not installed");

}

但现在我正在尝试使用swift打开,这是我的快速代码:

      if let path = NSBundle.mainBundle().pathForResource("book", ofType: "pdf") {
        if let targetURL = NSURL.fileURLWithPath(path) {

            let docController = UIDocumentInteractionController(URL: targetURL)
            let url = NSURL(string:"itms-books:");

            if UIApplication.sharedApplication().canOpenURL(url!) {

                docController.presentOpenInMenuFromRect(CGRectZero, inView: self.view, animated: true)

                println("iBooks is installed")

                }else{

                println("iBooks is not installed")
            }

        }
    }

但是当我选择iBooks打开pdf时会崩溃。任何人都可以帮助我!

3 个答案:

答案 0 :(得分:11)

我认为Bojan Macele有一个很好的答案,我使用他的代码,我认为它需要一些解释。我在应用程序崩溃时遇到了一些麻烦。只要确保docController是在你想要使用它的函数之外声明的。我在我的类声明下声明了这个变量。

import UIKit

class ViewController: UIViewController {

    var button : UIButton?
    var docController: UIDocumentInteractionController?

    override func viewDidLoad() {
        super.viewDidLoad()
        button = UIButton(frame: CGRectMake(10, 50, 100, 50))
        button?.backgroundColor = UIColor.blackColor()
        self.view.addSubview(button!)
        button?.addTarget(self, action: "buttonPressed:", forControlEvents: UIControlEvents.TouchDown)

    }

    func buttonPressed(sender: UIButton){
        println("button pressed")


        if let path = NSBundle.mainBundle().pathForResource("test", ofType: "pdf") {
            if let targetURL = NSURL.fileURLWithPath(path) {
                docController = UIDocumentInteractionController(URL: targetURL)
                let url = NSURL(string:"itms-books:");
                if UIApplication.sharedApplication().canOpenURL(url!) {
                    docController!.presentOpenInMenuFromRect(CGRectZero, inView: self.view, animated: true)
                    println("iBooks is installed")
                }else{
                    println("iBooks is not installed")
                }

            }
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

所以我只是做了一个演示项目来实现这个目的。就是这个。它需要在函数之外声明的原因是内存管理问题。一旦程序到达buttonPressed的末尾,它就不再知道docController是什么。然后,它尝试使用docController打开iBooks,这是一个非持久性变量,因此它会崩溃。

希望这会有所帮助。

答案 1 :(得分:4)

试试这个:

var docController: UIDocumentInteractionController?

if let path = NSBundle.mainBundle().pathForResource("book", ofType: "pdf") {
    if let targetURL = NSURL.fileURLWithPath(path) {

        docController = UIDocumentInteractionController(URL: targetURL)
        let url = NSURL(string:"itms-books:");

        if UIApplication.sharedApplication().canOpenURL(url!) {

            docController!.presentOpenInMenuFromRect(CGRectZero, inView: self.view, animated: true)

            println("iBooks is installed")

            }else{

            println("iBooks is not installed")
        }

    }
}

答案 2 :(得分:1)

Swift 3

var docController: UIDocumentInteractionController?

if let path = Bundle.main.path(forResource: "book", ofType: "pdf") {
        let targetURL = NSURL.fileURL(withPath: path)

        docController = UIDocumentInteractionController(url: targetURL)

        let url = NSURL(string:"itms-books:")

        if UIApplication.shared.canOpenURL(url! as URL) {

            docController!.presentOpenInMenu(from: CGRect.zero, in: self.view, animated: true)
        }
    }