gpt4 book ai didi

iphone - 使用UIDocumentInteractionController显示presentPreviewAnimated : via UIWebView

转载 作者:行者123 更新时间:2023-12-03 18:15:35 25 4
gpt4 key购买 nike

我想拦截来自任何 supported file types 的点击UIDocumentInteractionController 的并在模态视图中显示它们(由 UIDocumentInteractionController 的 presentPreviewAnimated: 方法提供)。此模态视图还提供“打开方式...”功能,可以在设备上的其他兼容应用程序中打开任何这些文档。下面的代码将拦截这些点击,检测 URL 字符串是否具有任何适当的后缀,加载此数据,将其写入目录,再次读取,最后通过 presentPreviewAnimated: 方法使用该数据。我必须首先将数据写入文件系统,因为 UIDocumentInteractionController 需要本地数据,并且无法直接使用来自 URL 的数据(据我所知)。

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
if (navigationType == UIWebViewNavigationTypeLinkClicked) {
ILog(@"URL loading for NavigationTypeLinkClicked: %@", request.URL.absoluteString);

if ([request.URL.absoluteString hasSuffix:@"pdf"] || [request.URL.absoluteString hasSuffix:@"doc"] || [request.URL.absoluteString hasSuffix:@"xls"] || [request.URL.absoluteString hasSuffix:@"ppt"] || [request.URL.absoluteString hasSuffix:@"rtf"] || [request.URL.absoluteString hasSuffix:@"key"] || [request.URL.absoluteString hasSuffix:@"numbers"] || [request.URL.absoluteString hasSuffix:@"pages"]) {
if (NSClassFromString(@"UIDocumentInteractionController")) {
NSArray *parts = [request.URL.absoluteString componentsSeparatedByString:@"/"];
self.previewDocumentFileName = [parts lastObject];
NSLog(@"The file name is %@", previewDocumentFileName);

// Get file online
NSData *fileOnline = [[NSData alloc] initWithContentsOfURL:request.URL];

// Write file to the Documents directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
if (!documentsDirectory) {NSLog(@"Documents directory not found!");}
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:previewDocumentFileName];
[fileOnline writeToFile:appFile atomically:YES];
NSLog(@"Resource file '%@' has been written to the Documents directory from online", previewDocumentFileName);
[fileOnline release];

// Get file again from Documents directory
NSURL *fileURL = [NSURL fileURLWithPath:appFile];

UIDocumentInteractionController* docController = [UIDocumentInteractionController interactionControllerWithURL:fileURL];

docController.delegate = self;
[docController retain];

BOOL result = [docController presentPreviewAnimated:YES];

if (!result) {
[docController release];
}
return NO;
}
}
}

// Do lots of other URL-detecting stuff here
}

我还实现了以下委托(delegate)方法来使用适当的 View 并在 View 关闭后删除文件(previewDocumentFileName 是一个类变量):

#pragma mark -
#pragma mark Document Interaction Controller Delegate Methods

- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller {
return self;
}

- (void)documentInteractionControllerDidEndPreview:(UIDocumentInteractionController *)controller {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:previewDocumentFileName];
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager removeItemAtPath:appFile error:NULL];
//[controller release]; // Release here was causing crashes
}

请注意,Apple 文档特别提到了需要手动保留文档 Controller 这一事实,所以我就这样做了。我还需要释放,所以如果 Controller 没有使用(顶级方法)并尝试在使用后释放它(委托(delegate)方法),我会这样做,但是该释放导致崩溃,所以我删除了它,事情看起来从这个角度来看,工作得很好。

随着背景的出现,我的问题与以下事实有关:虽然此代码似乎可以在 iPhone 模拟器中运行(在线文档在 presentPreviewAnimated: View 中正确显示,虽然没有无法在 sim 中使用的“打开方式...”对话框),但它在 iPad sim 或我的实际 iPhone 或 iPad 设备上没有显示 presentPreviewMethod:。我相信该方法被正确调用,但 presentPreviewAnimated: 方法返回 NO,这意味着它无法显示文档预览。

为什么会这样呢?我是否没有正确保存文件(因此它没有被检测为 *pdf 或 *doc 等)?我还能做错什么吗?除了 Apple 文档之外,很少有文档或示例代码,所以我希望这段代码至少对某人有帮助,尽管我希望首先让它 100% 工作。提前致谢。

最佳答案

忽略您[docControllerretain][controllerrelease]的事实 - 我建议您尝试[docControllerautorelease]。它有可能在您返回后立即尝试执行某些操作,但不会在稍后的执行过程中执行。如果是这种情况,您希望稍后释放 Controller ,这就是 autorelease 的用途。如果它仍然崩溃,则您不拥有该对象。不过,如果您保留它,您就有责任释放它。自动释放后,将其设置为nil,这样您就不会再次尝试触摸它。

关于iphone - 使用UIDocumentInteractionController显示presentPreviewAnimated : via UIWebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3325110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com