2011-11-27 8 views
5

मैं एक UIDocument उपवर्ग के साथ एक दस्तावेज़ आधारित आईओएस आवेदन किया है पर एक नए स्थान पर एक UIDocument स्थानांतरित करने के लिए उचित तरीका है। मुझे फ़ाइल-सिस्टम पर प्रदर्शित फ़ाइल को स्थानांतरित करने में सक्षम होना चाहिए। मैंने इसे NSFileManager के साथ ले जाने पर विचार किया है, लेकिन यह UIDocument की fileURL संपत्ति को गड़बड़ कर देगा। इस छोटे conundrum को हल करने के बारे में कोई विचार?क्या फ़ाइल-प्रणाली

उत्तर

5

आप पहली बार, पूरा होने हैंडलर में यह बंद हो रहा है, और फिर NSFileManager का उपयोग कर फ़ाइल को ले जाकर एक UIDocument नाम बदल सकते हैं।

NSURL *directoryURL = [_document.fileURL URLByDeletingLastPathComponent];  
NSFileManager *fileManager = [[NSFileManager alloc] init];  
NSString *filePath = [directoryURL.path stringByAppendingPathComponent:@"NewFileName"]; 

[_document closeWithCompletionHandler:^(BOOL success) { 
    NSError *error; 

    if (success) 
     success = [fileManager moveItemAtPath:_document.fileURL.path toPath:filePath error:&error]; 

    if (success) { 
     NSURL *url = [NSURL fileURLWithPath:filePath]; 

     // I handle opening the document and updating the UI in setDocument: 
     self.document = [[MyDocumentSubclass alloc] initWithFileName:[url lastPathComponent] dateModified:[NSDate date] andURL:url]; 
    } else { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil message:@"Unable to rename document" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil]; 
     [alert show]; 
     NSLog(@"Unable to move document: %@", error); 
    } 
}]; 
+0

हालांकि यह काम करेगा, आप हमेशा encapsulation का उल्लंघन किए बिना जाने से पहले दस्तावेज़ को बंद करने में सक्षम नहीं हैं। – Elland

-1

मैं UIDocument वर्ग विनिर्देश में यह पाया (5.1):

का कार्यान्वयन एक बार फ़ाइल सफलतापूर्वक ले जाया गया है, नई फ़ाइल URL का उपयोग कर अपने UIDocument उपवर्ग का एक नया उदाहरण प्रारंभ NSFilePresenter प्रोटोकॉल

UIDocument कक्षा NSFilePresenter प्रोटोकॉल को गोद लेती है। जब कोई अन्य ग्राहक UIDocument-आधारित एप्लिकेशन के दस्तावेज़ को पढ़ने का प्रयास करता है, तो उस पढ़ को तब तक निलंबित कर दिया जाता है जब तक कि UIDocument ऑब्जेक्ट को दस्तावेज़ में किए गए किसी भी बदलाव को सहेजने का मौका दिया जाता है।

हालांकि कुछ कार्यान्वयन कुछ भी नहीं करते हैं, UIDocument सभी NSFilePresenter विधियों को लागू करता है। विशेष रूप से, UIDocument:

relinquishPresentedItemToReader: इम्प्लीमेन्ट्स को भेजे ब्लॉक अग्रेषित करने के लिए।

अगर फ़ाइल संशोधन दिनांक बदल गया है की जाँच करने के relinquishPresentedItemToWriter: इम्प्लीमेन्ट्स; अगर फ़ाइल पहले से नई है, तो यह URL पैरामीटर के रूप में fileURL के मान के साथ revertToContentsOfURL:completionHandler: पर कॉल करती है।

दस्तावेज़ की फ़ाइल यूआरएल (fileURL) को अद्यतन करने के लिए presentedItemDidMoveToURL: लागू करता है।

अपने UIDocument सबक्लास में, यदि आप NSFilePresenter विधि को ओवरराइड करते हैं तो आप हमेशा सुपरक्लास कार्यान्वयन (super) का आह्वान कर सकते हैं।

मैं बुरी भी खोज रहा था और मुझे आशा है कि इसके बाद के संस्करण में मदद करता है। मैंने अभी तक इसका परीक्षण नहीं किया है - मैं अभी इस पर कूद रहा हूं।

तो मूल रूप से, अगर मुझे यहां कुछ भी याद नहीं है, तो आपको दस्तावेज़ को NSFileManager का उपयोग करके स्थानांतरित करना होगा और फिर अपने दस्तावेज़ पर presentedItemDidMoveToURL: पर कॉल करना होगा। यह सुनिश्चित करने के लिए कि आपको समस्याएं नहीं आती हैं, आपको शायद NSFileCoordinator का उपयोग करके फ़ाइल को स्थानांतरित करना होगा।

इस जवाब यह है कि गलत क्या है में सब कुछ ठीक करें। मैं अभी भी उन सभी चीजों में n00b हूं।

+1

यह सही विचार है, लेकिन मुझे नहीं लगता कि आपको 'presentItemDidMoveToURL:' सीधे कॉल करना चाहिए, बल्कि फ़ाइल समन्वयक अधिसूचनाओं को कॉल करना चाहिए। मुख्य कारण यह है कि आपके पास एक से अधिक फ़ाइल प्रस्तुतियां खुली हो सकती हैं, और अधिसूचना विधियों को कॉल करने से यह सुनिश्चित होगा कि वे सभी इसे प्राप्त करें। – Elland

2

यह पुरानी है लेकिन अभी भी प्रासंगिक हो सकता है।

क्या आप क्या करना चाहते है निम्नलिखित:

चलती के लिए: NSFileCoordinator उपयोग करके अपनी फ़ाइल ले जाते हैं, समन्वयक के ब्लॉक के अंदर, फोन

[fileCoordinator itemAtURL:URL willMoveToURL:toURL]; 
[fileManager moveItemAtURL:newURL toURL:toURL error:&moveError]; 
[fileCoordinator itemAtURL:URL didMoveToURL:toURL]; 

को हटाने के लिए: अपने UIDocument उपवर्ग के ऊपर लिख या फ़ाइल को लागू दस्तावेज़ को बंद करने के लिए प्रस्तुति प्रोटोकॉल विधि accommodatePresentedItemDeletionWithCompletionHandler:

- (void)accommodatePresentedItemDeletionWithCompletionHandler:(void (^)(NSError *))completionHandler; 
{ 
[self closeWithCompletionHandler:^(BOOL success) { 
    NSError *err; 
    if (!success) 
     err = [NSError error]; // implement your error here if you want 

    completionHandler(err); 
}]; 
} 

इस प्रकार यह सुनिश्चित करना कि इसे सही ढंग से स्थानांतरित किया जा सके।

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

  • कोई संबंधित समस्या नहीं^_^