2010-07-24 23 views
30

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

+0

'[docController release]': clang'i açın. Denetleyiciye sahip olmadığınız için bir uyarı oluşturulduğunu görmelisiniz. – jww

+0

'[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. –

+0

Benim için iyi çalışıyor. Teşekkürler Ricky –

cevap

-1

sadece

- (void)dealloc { 
[controller release]; 
controller = nil; 
[super dealloc]; 
} 

o tezahürat çalışacak düşünün yazın!

1

[docController retain] ve [controller release] gerçeklerini göz ardı ederseniz - [docController autorelease]'u denemenizi öneririz. Döndükten hemen sonra bir şey yapmaya çalışıyor, ama daha sonra idam sırasında değil. Eğer durum buysa, kontrolörünü biraz daha serbest bırakmak istersiniz, bu da autorelease için. Hala çökerse, nesneye sahip değilsiniz. Yine de, retain 'u kullanıyorsanız, bunun için release'dan sorumlusunuz. Otomatikleştirdikten sonra, nil'a ayarlayın, böylece tekrar dokunmaya çalışmazsınız.