为什么在iOS应用程序中将PDF文件写入和保存到Documents目录只能间歇性地成功?在我的应用程序中,我从一组UIViews创建了一个PDF,访问Documents文件夹并将文件存储在那里。
我估计80%的时间都有效。另外20%的时间是PDF创建的(我也将它通过电子邮件发送给自己,但是它实际上从未实际写入Documents文件夹。
如果失败,我可以给自己发送电子邮件,因此我知道它已经创建了。当我检查文件资源管理器中的Documents文件夹时,它是空的。当我注销它的内容时,它也是空的。我正在使用以下代码创建PDF并导出到Documents。
- (NSURL *)applicationDocumentsDirectory
{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
-(void)createPDFfromUIViews:(NSArray *)views saveToDocumentsWithFileName:(NSString*)aFilename andTag:(NSInteger)tag
{
// Creates a mutable data object for updating with binary data, like a byte array
NSMutableData *pdfData = [NSMutableData data];
// Points the pdf converter to the mutable data object and to the UIView to be converted
UIView *view1 = [views objectAtIndex:0];
UIGraphicsBeginPDFContextToData(pdfData, view1.bounds, nil);
CGContextRef pdfContext = UIGraphicsGetCurrentContext();
// draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData
for (UIView *view in views)
{
UIGraphicsBeginPDFPage();
[view.layer renderInContext:pdfContext];
}
// remove PDF rendering context
UIGraphicsEndPDFContext();
// Get the path to the documents directory and append the filename of the PDF
NSString *path = [[self applicationDocumentsDirectory].path stringByAppendingPathComponent:aFilename];
NSLog (@"DOCUMENTS DIRECTORY : %@", [self applicationDocumentsDirectory].path);
NSLog (@"DOCUMENTS DIRECTORY WITH FILE PATH : %@", path);
NSError *error = nil;
BOOL success = [pdfData writeToFile:path options:NSDataWritingWithoutOverwriting error:&error];
if (!success)
{
NSLog(@"Error writing PDF: %@", [error localizedDescription]);
}
else
{
if (tag == 1)
{
NSLog(@"PDF Saved With Name %@", aFilename);
[self.navigationController popViewControllerAnimated:YES];
}
else if (tag == 2)
{
[self checkAccountAndComposeEmailWithAttachmentData:pdfData andSubject:aFilename];
}
}
}
更新:修改代码以包含NSError。给出的错误是“操作无法完成。(可可错误4。)
更新2:修改了代码以包含Apple推荐的抓取Documents目录的方法。还添加了许多日志以显示我正在获得正确的目录/文件路径 - 两者都按预期显示Documents文件夹或Documents / File Name。每次仍然会将NSFileNoSuchFileError
作为错误返回。
答案 0 :(得分:2)
您可能应该使用允许您在
中传递错误指针的API进行编写- (BOOL)writeToFile:(NSString *)path options:(NSDataWritingOptions)mask error:(NSError **)errorPtr
然后,您可以检查NSError
是否写不正确,并使用此信息智能行动。
NSError *error = nil;
BOOL success = [pdfData writeToFile:documentDirectoryFilename options:NSDataWritingAtomic error:&error];
if (!success) {
NSLog(@"Error writing: %@", [error localizedDescription]);
}
您遇到的具体错误是NSFileNoSuchFileError,这可能是文件路径中可能存在空格或其他不受支持的字符的线索,以及其他原因。