2015-12-03 27 views
0

我是新來的Swift,所以請裸照我。我有一個與打開PDF文件相關的項目。這設置在Info.plist。當我在電子郵件中獲得PDF附件時,我可以將手指放在PDF附件上,然後在我的應用程序中打開。在我AppDelegate,我有以下補充:在WebView中將傳入的PDF保存到內存

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool { 
    incomingTransfer = URL 
    return true 
} 

incomingTransfer是在另一個ViewController聲明爲NSURL一個Global Variable。這ViewController也有一個UIWebViewincomingTransfer加載到它,我能夠看到新的PDF文件。我的目標是有一個允許用戶將傳入的PDF保存爲PDF的按鈕。我遇到了麻煩。我以爲我已經搞清楚了這一點,但它並沒有像PDF一樣保存,而是作爲String。有人能幫助我嗎?我的目標是將傳入的PDF文件作爲PDF保存到應用程序內存,最好是DocumentDirectory。我很難將Objective C轉換爲Swift。我原來的代碼保存它是:

let html = String(incomingFileTransfer) 
    let fmt = UIMarkupTextPrintFormatter(markupText: html) 

    let render = UIPrintPageRenderer() 
    render.addPrintFormatter(fmt, startingAtPageAtIndex: 0) 

    let page = CGRect(x: 0, y: 0, width: 595.2, height: 841.8) // A4, 72 dpi 
    let printable = CGRectInset(page, 0, 0) 

    render.setValue(NSValue(CGRect: page), forKey: "paperRect") 
    render.setValue(NSValue(CGRect: printable), forKey: "printableRect") 

    let pdfData = NSMutableData() 
    UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil) 

    for i in 1...render.numberOfPages() { 

     UIGraphicsBeginPDFPage(); 
     let bounds = UIGraphicsGetPDFContextBounds() 
     render.drawPageAtIndex(i - 1, inRect: bounds) 
    } 

    UIGraphicsEndPDFContext(); 

    recipeFileName = fileName.text! 

    print("File Name Entered: \(recipeFileName)") 

    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] 

    pdfData.writeToFile("\(documentsPath)/\(recipeFileName).pdf", atomically: true) 

回答

1

我想通了。我創建了一個名爲'PDFFile'的class。 'PDFFile'內有兩個variables,分別命名爲var name: Stringvar url: NSURL。在我的'IncomingTransfer'ViewController中,我有'save'button創建並保存來自UITextField的輸入名稱的新文件,並將我的AppDelegate中指定的incomingURL分配給urlvariable。然後兩個使用NSCoding保存到PDFFile類。然後,我從PDFFile Classarray數據中爲它設置UITableViewdataSource。當用戶點擊UITableViewCell時,我創建了一個segue,然後用UIWebView轉到新的ViewController。此WebView使用指定的url變量從urlRequest加載PDF,從NSCoding保存。

AppDelegate代碼:

// Allows incoming file access (PDF) 
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool { 

    // Transfer incoming file to global variable to be read 

    if url != "" { 

     // Load from Mail App 

     incomingFileTransfer = url 

     incomingStatus = "Incoming" 

    } else { 

     // Regular Load 

     print("App Delegate: No incoming file") 

     incomingFileTransfer = nil 

    }   

    return true 
} 

IncomingFile代碼並保存button代碼:

// MARK: Properties 
var file: PDFFile? 

// MARK: Actions 
// Save Button 
let name = fileName.text ?? "" 

let url = incomingFileTransfer 

file = PDFFile(name: name, url: url) 


// MARK: NSCoding 
func saveFiles() { 

    let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(pdfFiles, toFile: PDFFile.ArchiveURL.path!) 

    if !isSuccessfulSave { 

     print("Failed to save PDF file") 

    } 

} 

查看保存的PDF傳入後來ViewController代碼: // MARK:屬性 @IBOutlet弱VAR pdfItemWebView:UIWebView的!

var incomingURL: NSURL! 

// Within ViewDidLoad 
    if let file = file { 

     pdfFileName.text = file.name 

     incomingURL = file.url 

     print("Saved URL: \(incomingURL)") 

     print("Pending load...") 

     let request = NSURLRequest(URL: incomingURL!) 

     pdfItemWebView.loadRequest(request) 

    } 

這很複雜,但爲我工作。可能有一個更簡單的方法,但這是我想出來的,它的工作適合我的需求。