2015-04-16 30 views
18

Więc jestem obecnie próbuje wyświetlić lokalną PDF mam w UIWebView i jest to kod używam:Jak załadować lokalny PDF w UIWebView w 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); 
} 

Kod zostanie skutecznie budować, ale kiedy uruchomić aplikację zawiesisz z błędem: gwintu 1: EXC_BAD_INSTRUCTION (kod = EXC-I386_INVOP, subkod = 0x0)

znalazłem kilka tutoriali na temat jak to zrobić, ale wszystkie są bardzo nieaktualne lub w Objective-C.

Odpowiedz

41

Proszę bardzo:

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

Edit

Alternatywą jest poprzez 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) 
} 

Jabłko uczynić punktem doradzimy Ci, aby nie używać .loadRequest lokalnej HTML plików, nie rozszerzając go wyraźnie na inne typy danych. Dlatego podałem powyżej trasę NSData. Jeśli chcesz określić textEncodingName może być "UTF-8", "UTF-16", itp

Edit: Swift 3

Oto Swift 3 wersja kodu stosując jako firmy Apple doradza, WKWebView w miejsce 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

Program ViewController załaduje się bez awarii, ale plik PDF nie ładuje się. Myślę, że aplikacja może mieć problem ze znalezieniem pliku – dannysandler

+0

Działa dla mnie, sprawdź nazwę pdf – sketchyTech

+0

Próbowałem innego pliku próbki i działało! – dannysandler

2

Dla Xcode 8.1 i Swift 3.0

zapisać plik PDF w dowolnym folderze Xcode. Załóżmy, że nazwa pliku jest „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)   
    } 

będą miały zastosowanie, jeśli chcesz otworzyć dowolny plik HTML samo.

1

import WebKit

tutaj można załadować plik PDF w aplikacji

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

Dla Swift 3 użycia tego kodu:

let url = URL(fileURLWithPath: filePath) 

let urlRequest = URLRequest(url: url) 

webView?.loadRequest(urlRequest) 
2

Aktualizacja dla 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

Powiązane problemy