كيف يمكنني إنشاء نوع مستورد فقط في الكاكاو؟

StackOverflow https://stackoverflow.com/questions/979647

  •  13-09-2019
  •  | 
  •  

سؤال

هناك نوع ملف استيراد التطبيق الخاص بي ولكن لا حفظ. لقد أضفت إدخالا إلى أنواع المستندات وتعيينه للقراءة فقط، ولكن هذا لا يؤدي إلى سلوك الاستيراد الذي أبحث عنه. بدلا من ذلك، سيقوم تطبيقي بفتح الملف فقط وعندما يتم الكتابة فوق الملف الأصلي في تنسيق الملف الخاص بي.

كيفية إعداد المستند أو أنواع المستندات لجعلها بحيث يتم إنشاء مستند جديد مع البيانات من المستند الأصلي، بدلا من فتح الأصلي؟

هل كانت مفيدة؟

المحلول

1. أعلن أنواع الملفات كأنواع المستندات

ضمن مشروع Xcode الخاص بك، أضف أ نوع الوثيقة لجميع تنسيقات الملفات تدعم التطبيق الخاص بك. تعيين دور من كل نوع وفقا لقدرات التطبيق الخاص بك:

  • مارك قراءة / كتابة أنواع الملفات القادرة محرر;
  • مارك استيراد أنواع الملفات فقط كما مشاهد.

تعيين فصل إلى نوع المستند الذي تريد التعامل مع كل نوع ملف. يمكن لفئة وثيقة واحدة التعامل مع أنواع ملفات متعددة.

في المثال أدناه، هناك ثلاثة أنواع ملفات معلنة: Gont-Pestle، OTF، و TTF. الأول، وضع الخط، هو التنسيق الأصلي للتطبيق. هذا النوع لديه الدور محرر.

يمكن استيراد التنسيقين المتبقيين، OTF و TTF، ولكن غير مكتوبة من قبل التطبيق؛ هكذا يتم وضع علامة عليها مشاهد.

Example Document Types

2. أنواع الملفات الإضافية في الفئة الفرعية NSDocument الخاصة بك

مع إضافة أنواع المستندات، سيتيح التطبيق تلقائيا للمستخدمين فتح ملفات الأنواع المحددة.

تحتاج إلى إضافة رمز معالجة نوع الملف إلى فئة المستندات. في الحالة المثالية، أضف رمز المتفرع إلى readFromData:ofType:error: طريقة:

- (BOOL)readFromData:(NSData*)someData ofType:(NSString*)typeName error:(NSError**)outError
{
    if ([NSWorkspace.sharedWorkspace type:@"eu.miln.font-pestle" conformsToType:typeName] == YES)
    {
        // read native format
    }
    else if ([NSWorkspace.sharedWorkspace type:@"public.opentype-font" conformsToType:typeName] == YES)
    {
        // read import only format

        // disassociate document from file; makes document "untitled"
        self.fileURL = nil;
        // associate with primary file type
        self.fileType = @"eu.miln.font-pestle";

    }
    else // ...

}

ال self.fileURL = nil; أنه مهم. من خلال تعيين Fileurl إلى NIL، فأنت تقول إن المستند غير مرتبط بأي ملف على القرص ويجب التعامل معه كوثيقة جديدة.

للسماح بالحفظ التلقائي، قم بتطبيق طريقة NSDocument autosavingFileType لإرجاع نوع الملف الأساسي.

نصائح أخرى

أليكس، شكرا لإجابتك، لكنني وجدت طريقة أحب أكثر قليلا:

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName
               error:(NSError **)outError
{
    *outError = nil;
    if ([typeName isEqualToString:@"SomeReadOnlyType"])
    {
        // .. (load data here)
        [self setFileURL:nil];

        return result;
    }
    else
    {
        // .. (do whatever you do for other documents here)
    }
}

وبهذه الطريقة لا يزال من الممكن استخدام نظام المستند الذي توفره الكاكاو بدلا من ذلك.

لقد وثقت أيضا الحل هنا: http://www.cocoadev.com/index.pl؟cfbundletletyperleprole. قليلا أسفل الصفحة.

لا أعتقد أن وظيفة الاستيراد مدعومة افتراضيا في الكاكاو. عندما ينقر المستخدم على الزر "فتح" في اللوحة المفتوحة، يستدعي الإطار openDocumentWithContentsOfURL:display:error: تشغيل NSDocumentController. وبعد هذا هو المكان الذي يوجد فيه نظام المستندات نوع الملف الذي تفتحه والتشاور مع ملف المعلومات. الرجاء معرفة أي NSDocument Subclass لاستخدامها لفتح المستند.

هل يمكن أن تثقيف NSDocumentController وتجاوز openDocumentWithContentsOfURL:display:error: الطريقة لاعتراض أنواع الملفات التي يجب استيرادها بدلا من فتحها. في الخاص بك NSDocument Subclass، اكتب تهيئة جديدة باسم مثل initWithImportedContentsOfURL:type:error: (أو شيء ما مع اسم أفضل :-)) لإنشاء مستند جديد غير مرتبط والقراءة في محتويات الملف المستورد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top