1

我有点迷失在我的追求——

  1. 下载 CKAsset(PDF 文件)
  2. 分配临时文件名
  3. 将CKAsset的内容写入文件名

我已经设法下载了 CKAsset 并在 UIWebView 中显示了内容,但是我在第 2 步和第 3 步中遇到了麻烦,我有一个来自字符串的文件名,尽管尝试了各种 WriteToFile 组合,但我收到了错误。

我的代码是这样的:

let filename = record.object(forKey: "materialsFilename")

                        if  materialsType == "PDF" || materialsType == "pdf" {


                            if let asset1 = record.object(forKey: "materialsFile") as? CKAsset {
                                let doc1Data : NSData? = NSData(contentsOf:asset1.fileURL)

                                let path = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(filename as! String)


                                let contentsOfFile = doc1Data
                                var error: NSError?

                                // Write File
                                if contentsOfFile.writeToFile(path, atomically: true, encoding: String.Encoding.utf8, error: &error) == false {
                                    if let errorMessage = error {
                                        print("Failed to create file")
                                        print("\(errorMessage)")
                                    }
                                } else {
                                    print("File \(filename) created at tmp directory")
                                }

此版本出现错误 -

无法使用类型为“(URL?,原子:Bool,编码:String.Encoding,错误:inout NSError?)”的参数列表调用“writeToFile”

一旦创建的临时文件将被传递给 UIActivityViewController,以打印/电子邮件/空投 PDF,只有一个 CKAsset 名称,UIActivityViewController 无法将文件类型与任何用户安装的应用程序相关联,保存以供打印。

4

3 回答 3

1

经过一点头疼并按照上面的指示检查了我的选择后,我改变了策略,并不真的需要写入文件,只需重命名 CKAsset,这是我使用以下脚本实现的 -

let materialsType = record.object(forKey: "materialsType") as! String

                        let filename = record.object(forKey: "materialsFilename") as! String

                        if  materialsType == "PDF" || materialsType == "pdf" {

                            if let asset1 = record.object(forKey: "materialsFile") as? CKAsset {

                                let doc1Data : Data? = Data(contentsOf:asset1.fileURL) as Data?
                                let fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(filename)
                                self.materialsWebView.load(doc1Data! as Data, mimeType: "application/pdf", textEncodingName: "UTF-8", baseURL: NSURL() as URL)
                                self.filenameURL = [(fileURL)]
                            }

关键似乎取决于两条线——

let fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(filename)

self.filenameURL = [(fileURL)]

它为 UIActivityViewController 生成文件名,从而打开了对许多其他应用程序的访问。

于 2017-04-05T16:47:09.513 回答
0

你确定你使用的是正确的writeToFile方法吗?该NSData 参考未显示具有您正在使用的相同签名的方法。尝试使用参考中列出的其中一种。

于 2017-04-05T10:03:06.153 回答
0

我只在 Data 类中找到以下函数。

func write(to: URL, options: Data.WritingOptions)

尝试这个。

于 2017-04-05T10:17:45.550 回答