cihaz aracılığıyla UIDocumentInteractionController arasında supported file types herhangi birinden tıklama kesmek ve (UIDocumentInteractionController arasında presentPreviewAnimated:
yöntemle sağlanan), model bir görünümde görüntülemek için istiyorum. Bu modal görünüm ayrıca, bu belgeleri cihazdaki diğer uyumlu uygulamalarda açmak için "İçeri Aç ..." işlevini de sağlar. Aşağıdaki kod bu tıklamaları yakalayacaktır, URL dizgisinin uygun soneklerden herhangi birine sahip olup olmadığını algılayıp, bu verileri yükleyin, dizine yazın, tekrar okuyun ve son olarak verileri presentPreviewAnimated:
yöntemiyle kullanın. UIDocumentInteractionController yerel verileri gerektirdiğinden ve verileri doğrudan URL'den kullanamadığımdan (okuduğum kadarıyla) veriyi ilk önce dosya sistemine yazmam gerekiyor.: UIWebView
#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
}
Elma lütfen unutmayın: görünüm görevden sonra
- (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
}
Ben de uygun görünümü kullanmak ve dosyayı silmek için aşağıdaki temsilci yöntemleri uygulamak (previewDocumentFileName
bir sınıf değişkendir) Dokümantasyon, belge denetleyicisinin el ile saklanmasının gerekmesi gerçeğinden bahsetmişti, ben de bunu yaptım. Ayrıca piyasaya sürülmem gerekiyor, bu yüzden denetleyici kullanılmadığında (en iyi yöntem) ve kullanıldıktan sonra serbest bırakmaya çalıştıysa (delege yöntemi), ancak bu sürüm kilitlenmesine neden oluyordu, bu yüzden onu kaldırdım ve işler görünüyor bu açıdan iyi çalışıyor olmak.
Arka planın dışına çıkarsa, bu kod iPhone simülatöründe çalışırken (çevrimiçi belge presentPreviewAnimated:
görünümünde doğru şekilde görüntüleniyor olsa da, içeride "Açık" olmaksızın) bulunmalıdır. .. 'simanda kullanılamayan diyalog'), iPad sim'inde veya gerçek iPhone'um veya iPad cihazımda presentPreviewMethod:
'u göstermiyor. Yöntemin doğru çağrıldığına inanıyorum, ancak presentPreviewAnimated:
yöntemi NO
döndürüyor, bu da belge önizlemesini görüntüleyemediği anlamına geliyor.
Neden böyle olur? Dosyayı düzgün şekilde kaydetmiyorum (ve dolayısıyla * pdf veya * doc, vb. Olarak algılanmıyor)? Başka ne yanlış yapabilirim? Apple Belgeselinin yanı sıra çok az belge veya örnek kodu var, bu yüzden en azından bu kodun birisine yararlı olacağını umuyorum, ancak ilk önce% 100 çalışmayı tercih ediyorum. Şimdiden teşekkürler. dealloc yöntemi
'[docController release]': clang'i açın. Denetleyiciye sahip olmadığınız için bir uyarı oluşturulduğunu görmelisiniz. – jww
'[controller release];' - Bu, bu nesneden sorumlu olmadığınız için çökmelere neden olur. Parametrede sizin için sağlanmıştır. Onu serbest bırakabilmek için tahsis etmediniz. –
Benim için iyi çalışıyor. Teşekkürler Ricky –