2010-07-24 9 views
30

के माध्यम से मैं UIDocumentInteractionController की supported file types में से किसी से प्राप्त क्लिक रोकना और उन्हें (UIDocumentInteractionController की presentPreviewAnimated: विधि द्वारा प्रदान की) एक मॉडल दृश्य में प्रदर्शित करना चाहते हैं। यह मोडल व्यू डिवाइस पर अन्य संगत अनुप्रयोगों में से किसी भी दस्तावेज़ को खोलने के लिए "ओपन इन ..." कार्यक्षमता भी प्रदान करता है। नीचे दिया गया कोड इन क्लिकों को रोक देगा, पता लगाएगा कि यूआरएल स्ट्रिंग में उचित प्रत्यय में से कोई एक है, इस डेटा को लोड करें, इसे निर्देशिका में लिखें, इसे फिर से पढ़ें और आखिरकार presentPreviewAnimated: विधि के साथ डेटा का उपयोग करें। मुझे पहले फ़ाइल सिस्टम में डेटा लिखना है क्योंकि UIDocumentInteractionController को स्थानीय डेटा की आवश्यकता होती है और सीधे यूआरएल से डेटा का उपयोग नहीं कर सकता (जहां तक ​​मैंने पढ़ा है)।presentPreviewAnimated प्रदर्शित करने के लिए UIDocumentInteractionController का उपयोग करना: 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 
} 

कृपया ध्यान दें कि एप्पल:

- (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 
} 

के बाद दृश्य खारिज कर दिया गया मैं भी निम्न प्रतिनिधि तरीकों को लागू उचित दृश्य का उपयोग करने के लिए और फ़ाइल को नष्ट करने के लिए (previewDocumentFileName एक वर्ग चर रहा है) दस्तावेज़ीकरण ने इस तथ्य का विशिष्ट उल्लेख किया कि दस्तावेज़ नियंत्रक को मैन्युअल रूप से बनाए रखने की आवश्यकता है, इसलिए मैंने ऐसा किया। मुझे भी रिलीज़ होने की जरूरत है, इसलिए मैं ऐसा करता हूं अगर नियंत्रक का उपयोग नहीं किया गया था (शीर्ष विधि) और इसे इस्तेमाल करने के बाद इसे रिलीज़ करने का प्रयास किया गया (प्रतिनिधि विधि), लेकिन उस रिलीज में क्रैश हो रहा था, इसलिए मैंने इसे हटा दिया और चीजें लगती हैं उस दृष्टिकोण से ठीक काम करने के लिए।

रास्ते से पृष्ठभूमि के साथ, मेरे प्रश्न को इस तथ्य के साथ करना है कि यह कोड आईफोन सिम्युलेटर में काम करता है (ऑनलाइन दस्तावेज़ presentPreviewAnimated: दृश्य में सही ढंग से प्रदर्शित होता है, हालांकि 'ओपन इन' के बिना। .. 'संवाद जो सिम में उपयोग नहीं किया जा सकता है), यह आईपैड सिम या मेरे वास्तविक आईफोन या आईपैड डिवाइस पर presentPreviewMethod: नहीं दिखा रहा है। मेरा मानना ​​है कि विधि को सही तरीके से बुलाया जा रहा है, लेकिन presentPreviewAnimated: विधि NO लौट रही है, जिसका अर्थ है कि यह दस्तावेज़ पूर्वावलोकन प्रदर्शित करने में सक्षम नहीं था।

यह क्यों होगा? क्या मैं फ़ाइल को ठीक से सहेज नहीं रहा हूं (और इस प्रकार इसे * पीडीएफ या * डॉक्टर आदि के रूप में नहीं पहचाना जा रहा है)? मैं और क्या गलत कर सकता था? ऐप्पल दस्तावेज़ीकरण के अलावा वहां बहुत कम दस्तावेज या उदाहरण कोड है, इसलिए मुझे आशा है कि कम से कम यह कोड किसी के लिए सहायक होगा, हालांकि मैं इसे 100% पहले काम करना चाहता हूं। अग्रिम में धन्यवाद।

+0

'[डॉक कंट्रोलर रिलीज] ': क्लैंग चालू करें। आपको पता होना चाहिए कि एक चेतावनी उत्पन्न होती है क्योंकि आपके पास नियंत्रक नहीं है। – jww

+0

'[नियंत्रक रिलीज];' - यह दुर्घटनाओं का कारण बनता है क्योंकि आप इस वस्तु के लिए ज़िम्मेदार नहीं हैं। यह पैरामीटर में आपके लिए प्रदान किया जाता है। आपने इसे जारी करने में सक्षम होने के लिए इसे आवंटित नहीं किया है। –

+0

यह मेरे लिए ठीक काम कर रहा है। धन्यवाद रिकी –

उत्तर

-1

dealloc विधि में आप बस लिखने

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

सोचो यह जयकार काम करेंगे!

1

इस तथ्य को अनदेखा करते हुए कि आप [docController retain] और [controller release] - मुझे सलाह है कि आप [docController autorelease] आज़माएं। एक मौका है कि यह लौटने के तुरंत बाद कुछ करने की कोशिश कर रहा है, लेकिन बाद में निष्पादन के दौरान नहीं। यदि ऐसा है, तो आप नियंत्रक को थोड़ी देर बाद जारी करना चाहते हैं, जो autorelease है। यदि यह अभी भी दुर्घटनाग्रस्त है, तो आपके पास ऑब्जेक्ट का स्वामित्व नहीं है। हालांकि, अगर आप retain हैं, तो आप release के लिए जिम्मेदार हैं। एक बार जब आप इसे ऑटोरेलेज़ कर लेंगे, तो उसे nil पर सेट करें ताकि आप इसे फिर से स्पर्श करने की कोशिश न करें।

संबंधित मुद्दे