würde Ich mag den Klicks von einem der supported file types der UIDocumentInteractionController abfängt und sie in einer modalen Ansicht angezeigt (durch presentPreviewAnimated:
Verfahren UIDocumentInteractionController Verfügung gestellt). Diese modale Ansicht bietet auch die Funktion "Öffnen in ...", um eines dieser Dokumente in anderen kompatiblen Anwendungen auf dem Gerät zu öffnen. Der folgende Code fängt diese Klicks ab, erkennt, ob die URL-Zeichenfolge eines der entsprechenden Suffixe hat, lädt diese Daten, schreibt sie in das Verzeichnis, liest sie erneut und verwendet schließlich die Daten mit der Methode presentPreviewAnimated:
. Ich muss die Daten zuerst in das Dateisystem schreiben, da der UIDocumentInteractionController lokale Daten benötigt und die Daten nicht direkt von der URL aus verwenden kann (soweit ich gelesen habe).UIDocumentInteractionController Verwendung presentPreviewAnimated anzuzeigen: via UIWebView
- (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
}
ich auch folgende Delegatmethoden implementieren, um die entsprechende Ansicht zu verwenden und die Datei zu löschen, nachdem die Ansicht zurückgewiesen wurde (previewDocumentFileName
ist eine Klassenvariable):
#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
}
Bitte beachten Sie, dass das Apple In der Dokumentation wurde ausdrücklich erwähnt, dass der Dokumenten-Controller manuell aufbewahrt werden musste, also habe ich das getan. Ich muss auch veröffentlicht werden, also mache ich das, wenn der Controller nicht verwendet wurde (Top-Methode) und versuchte, ihn nach seiner Verwendung freizugeben (Delegate-Methode), aber diese Version verursachte Abstürze, also entfernte ich sie und die Dinge scheinen von diesem Standpunkt aus gut zu funktionieren.
Mit dem Hintergrund aus dem Weg, meine Frage hat damit zu tun, dass während dieser Code im iPhone Simulator funktioniert scheint (das Online-Dokument wird korrekt in der presentPreviewAnimated:
Ansicht angezeigt, obwohl ohne die 'Open In. .. 'Dialog, der nicht in der Sim verwendet werden kann, es zeigt nicht die presentPreviewMethod:
auf dem iPad sim oder meine tatsächlichen iPhone oder iPad Geräte. Ich glaube, dass die Methode korrekt aufgerufen wird, aber die Methode presentPreviewAnimated:
gibt NO
zurück, was bedeutet, dass die Dokumentvorschau nicht angezeigt werden konnte.
Warum sollte das sein? Speichere ich die Datei nicht richtig (und wird nicht als * pdf oder * doc usw. erkannt)? Was könnte ich sonst falsch machen? Es gibt sehr wenig Dokumentations- oder Beispielcode außer der Apple-Dokumentation, daher hoffe ich, dass zumindest dieser Code für jemanden hilfreich sein wird, obwohl ich es gerne zu 100% arbeiten lassen würde. Danke im Voraus.
'[docController release]': klingelt. Sie sollten feststellen, dass eine Warnung generiert wird, da Sie den Controller nicht besitzen. – jww
'[Controller Release];' - Dies führt zu Abstürzen, weil Sie nicht für dieses Objekt verantwortlich sind. Es ist in dem Parameter für Sie vorgesehen. Sie haben es nicht zugewiesen, um es veröffentlichen zu können. –
Es funktioniert gut für mich. Danke Ricky –