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

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

in。h

@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时会崩溃。 谁能帮我!

我认为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,这是一个非持久性变量,因此它崩溃了。

希望这可以帮助。

尝试这个:

 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") } } } 

斯威夫特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) } }