2015-04-16 2 views
18

Так что я в настоящее время пытается отобразить локальный PDF я имею в UIWebView и это код, я использую:Как загрузить Local PDF в UIWebView в Swift

@IBOutlet weak var webView:UIWebView! 
override func viewDidLoad() { 
    super.viewDidLoad()  

var pdfLoc = NSURL(fileURLWithPath:NSBundle.mainBundle().pathForResource("Sample", ofType:"pdf")!) 
var request = NSURLRequest(URL: pdfLoc); 
self.webView.loadRequest(request); 
} 

код будет успешно строить, но когда я запустить приложение, оно будет врезаться с ошибкой: Тема 1: EXC_BAD_INSTRUCTION (код = EXC-I386_INVOP, субкодовое = 0x0)

Я нашел несколько учебников о том, как это сделать, но все они очень устаревшим или в Objective-C.

ответ

41

Здесь вы идете:

if let pdf = NSBundle.mainBundle().URLForResource("myPDF", withExtension: "pdf", subdirectory: nil, localization: nil) { 
      let req = NSURLRequest(URL: pdf) 
      let webView = UIWebView(frame: CGRectMake(20,20,self.view.frame.size.width-40,self.view.frame.size.height-40)) 
      webView.loadRequest(req) 
      self.view.addSubview(webView) 
     } 

Редактировать

Альтернатива через NSData:

if let pdfURL = NSBundle.mainBundle().URLForResource("myPDF", withExtension: "pdf", subdirectory: nil, localization: nil),data = NSData(contentsOfURL: pdfURL), baseURL = pdfURL.URLByDeletingLastPathComponent { 
    let webView = UIWebView(frame: CGRectMake(20,20,self.view.frame.size.width-40,self.view.frame.size.height-40)) 
    webView.loadData(data, MIMEType: "application/pdf", textEncodingName:"", baseURL: baseURL) 
    self.view.addSubview(webView) 
} 

Apple, сделать точку консультирования вам не использовать .loadRequest для локального HTML файлов, хотя это явно не распространяется на другие типы данных. Поэтому я предоставил маршрут NSData выше. Если вы хотите, чтобы указать textEncodingName это может быть "UTF-8", "UTF-16" и т.д.

Edit: Swift 3

Вот версия Swift 3 кода с использованием в качестве Apple, посоветуйте, WKWebView вместо UIWebView.

import UIKit 
import WebKit 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     if let pdfURL = Bundle.main.url(forResource: "myPDF", withExtension: "pdf", subdirectory: nil, localization: nil) { 
      do { 
       let data = try Data(contentsOf: pdfURL) 
       let webView = WKWebView(frame: CGRect(x:20,y:20,width:view.frame.size.width-40, height:view.frame.size.height-40)) 
       webView.load(data, mimeType: "application/pdf", characterEncodingName:"", baseURL: pdfURL.deletingLastPathComponent()) 
       view.addSubview(webView) 

      } 
      catch { 
       // catch errors here 
      } 

     } 
    } 

} 
+0

ViewController теперь загружается без сбоев, но PDF-файл не загружается. Я думаю, что у приложения может возникнуть проблема с поиском файла – dannysandler

+0

Работает для меня, проверьте имя pdf – sketchyTech

+0

Я попробовал другой образец файла, и он сработал! – dannysandler

2

Для Xcode 8.1 и Swift 3.0

Сохранить файл PDF в любой папке Xcode. Предположим, что имя файла «Filename.pdf»

if let pdf = Bundle.main.url(forResource: "Filename", withExtension: "pdf", subdirectory: nil, localization: nil) { 
    let req = NSURLRequest(url: pdf) 
    webViewPresentation.loadRequest(req as URLRequest)   
    } 

То же будет применяться, если вы хотите, чтобы открыть любой файл HTML.

1

импорт WebKit

здесь вы можете загрузить PDF в приложении

override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     if let pdfURL = Bundle.main.url(forResource: "food-and-drink-menu-trafalgar-tavern", withExtension: "pdf", subdirectory: nil, localization: nil) { 
      do { 
       let data = try Data(contentsOf: pdfURL) 
       let webView = WKWebView(frame: CGRect(x:0,y:NavigationView.frame.size.height,width:view.frame.size.width, height:view.frame.size.height-NavigationView.frame.size.height)) 
       webView.load(data, mimeType: "application/pdf", characterEncodingName:"", baseURL: pdfURL.deletingLastPathComponent()) 
       view.addSubview(webView) 

      } 
      catch { 
       // catch errors here 
      } 

     } 
} 
0

Для Swift 3 использовать этот код:

let url = URL(fileURLWithPath: filePath) 

let urlRequest = URLRequest(url: url) 

webView?.loadRequest(urlRequest) 
2

Изменено для Swift 3

import UIKit 
import WebKit 

class ViewController: UIViewController { 

    let webView = WKWebView() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     loadPdf() 
     setupViews() 
    } 

    func loadPdf() { 

     if let pdfUrl = Bundle.main.url(forResource: "YourPdfFileName", withExtension: "pdf", subdirectory: nil, localization: nil) { 

      do { 
       let data = try Data(contentsOf: pdfUrl) 
       webView.load(data, mimeType: "application/pdf", characterEncodingName:"", baseURL: pdfUrl.deletingLastPathComponent()) 
       print("pdf file loading...") 
      } 
      catch { 
       print("failed to open pdf") 
      } 
      return 
     } 

     print("pdf file doesn't exist") 
    } 

    func setupViews() { 

     title = "View PDF Demo" 
     view.backgroundColor = .white 
     view.addSubview(webView) 

     // setup AutoLayout... 
     webView.translatesAutoresizingMaskIntoConstraints = false 
     webView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true 
     webView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true 
     webView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true 
     webView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 
    } 
} 

enter image description here

Смежные вопросы