मैं एक UIDocument
उपवर्ग के साथ एक दस्तावेज़ आधारित आईओएस आवेदन किया है पर एक नए स्थान पर एक UIDocument स्थानांतरित करने के लिए उचित तरीका है। मुझे फ़ाइल-सिस्टम पर प्रदर्शित फ़ाइल को स्थानांतरित करने में सक्षम होना चाहिए। मैंने इसे NSFileManager
के साथ ले जाने पर विचार किया है, लेकिन यह UIDocument
की fileURL
संपत्ति को गड़बड़ कर देगा। इस छोटे conundrum को हल करने के बारे में कोई विचार?क्या फ़ाइल-प्रणाली
उत्तर
आप पहली बार, पूरा होने हैंडलर में यह बंद हो रहा है, और फिर 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);
}
}];
मैं 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 हूं।
यह सही विचार है, लेकिन मुझे नहीं लगता कि आपको 'presentItemDidMoveToURL:' सीधे कॉल करना चाहिए, बल्कि फ़ाइल समन्वयक अधिसूचनाओं को कॉल करना चाहिए। मुख्य कारण यह है कि आपके पास एक से अधिक फ़ाइल प्रस्तुतियां खुली हो सकती हैं, और अधिसूचना विधियों को कॉल करने से यह सुनिश्चित होगा कि वे सभी इसे प्राप्त करें। – Elland
यह पुरानी है लेकिन अभी भी प्रासंगिक हो सकता है।
क्या आप क्या करना चाहते है निम्नलिखित:
चलती के लिए: 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);
}];
}
इस प्रकार यह सुनिश्चित करना कि इसे सही ढंग से स्थानांतरित किया जा सके।
हालांकि यह काम करेगा, आप हमेशा encapsulation का उल्लंघन किए बिना जाने से पहले दस्तावेज़ को बंद करने में सक्षम नहीं हैं। – Elland