سؤال

لديّ أداة تكتب مستندات على غرار الحزمة. يتم تنفيذه باستخدام NSDocument ويتجاوز أساليب NSDOCINGUME التالية:

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName
                              error:(NSError **)outError;

- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper
                    ofType:(NSString *)typeName
                     error:(NSError **)outError;

هذا كله جميل ، إلا عندما أقوم بحفظ مستند تحت التحكم في الإصدار. (لا يتم الحفاظ على أدلة .svn ، وما إلى ذلك)

هل هناك وصفة جيدة في مكان ما لجعل مستنداتي تلعب بشكل جيد مع SVN؟

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

المحلول

أظن أن الرمز الخاص بك يعمل عن طريق إنشاء غلاف ملف جديد في كل مرة -fileWrapperOfType:error: يسمى. هذا مناسب ، ولكن يتجاهل أي ملفات إضافية قد توجد على القرص داخل الحزمة.

بدلاً من ذلك ، ماذا لو بدأت بإنشاء/استخدام غلاف ملف يشير إلى المحتويات الموجودة على القرص. قم بتعديل هذا الغلاف لمطابقة الحالة الحالية للمستند ، وإرجاع النتيجة. عندما يتم كتابة هذا الغلاف إلى القرص ، يجب الحفاظ على ملفات SVN بشكل صحيح.

نصائح أخرى

هذا هو الحل القائم على إجابة مايك!

حزم المستندات الخاصة بي هي حزم ، مع الهيكل الهرمي المعتاد ... لذلك هناك أربع أدلة أتحورها أثناء الحفظ:

  1. ينشئ الحفظ مستوى جديد (my.bundle)
  2. تم تغيير دليل المحتويات (my.bundle/المحتويات)
  3. تم تغيير دليل الموارد (my.bundle/المحتويات/الموارد)
  4. يتم تحديث الموارد المترجمة (my.bundle/المحتويات/الموارد/en.lproj)

تبدأ الوصفة بإضافة فتحة قاموس قابلة للتغيير إلى فئة المستند الخاصة بك للحفاظ على محتويات كل من هذه الدلائل.

@interface LMDocument : NSDocument {
@private
    // All this is for preserving SCM artifacts across saves…
    NSMutableDictionary * bundleWrappers;
    NSMutableDictionary * contentsWrappers;
    NSMutableDictionary * resourcesWrappers;
    NSMutableDictionary * localizedWrappers;
}

عند إنشاء مستند جديد ، تبدأ هذه القواميس الفارغة.

- (id)init;
{
    if ((self = [super init]) != nil) {
        bundleWrappers = [[NSMutableDictionary alloc] initWithCapacity:0];
        contentsWrappers = [[NSMutableDictionary alloc] initWithCapacity:0];
        resourcesWrappers = [[NSMutableDictionary alloc] initWithCapacity:0];
        localizedWrappers = [[NSMutableDictionary alloc] initWithCapacity:0];
    }
    return self;
}

عند القراءة في وثيقة موجودة ، استبدلها بنسخ قابلة للتغيير من محتويات filewrapper ذات الصلة.

- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper
                     ofType:(NSString *)typeName
                      error:(NSError **)outError;
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    bundleWrappers = [[fileWrapper fileWrappers] mutableCopy];
    contentsWrappers = [[[bundleWrappers objectForKey:@"Contents"] fileWrappers] mutableCopy];
    resourcesWrappers = [[[contentsWrappers objectForKey:@"Resources"] fileWrappers] mutableCopy];
    localizedWrappers = [[[resourcesWrappers objectForKey:@"en.lproj"] fileWrappers] mutableCopy];
    NSFileWrapper * infoPlistWrapper = [contentsWrappers objectForKey:@"Info.plist"];
    [contentsWrappers removeObjectForKey:@"Info.plist"]; // Replaced during save…
    // …
    NSMutableDictionary * localizedWrappersCopy = [localizedWrappers mutableCopy];
    [localizedWrappers enumerateKeysAndObjectsUsingBlock:^(id key,
                                                           id obj,
                                                           BOOL * stop)
     {
         if (mumble) { // If it's a file that will be replaced during save…
             [localizedWrappersCopy removeObjectForKey:key]; // Replaced during save…
             // …
         }
     }];
    localizedWrappers = localizedWrappersCopy;
    [pool drain];
    return YES;
}

و أخيرا, ، عند حفظ وثيقة استخدم القواميس التي تم إعدادها بشق الأنفس.

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName
                               error:(NSError **)outError;
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSFileWrapper * localizedWrapper =
    [[NSFileWrapper alloc] initDirectoryWithFileWrappers:localizedWrappers];
    [resourcesWrappers setObject:localizedWrapper
                          forKey:@"en.lproj"];
    NSFileWrapper * resourcesWrapper =
    [[NSFileWrapper alloc] initDirectoryWithFileWrappers:resourcesWrappers];
    [contentsWrappers setObject:resourcesWrapper
                         forKey:@"Resources"];
    NSFileWrapper * contentsWrapper =
    [[NSFileWrapper alloc] initDirectoryWithFileWrappers:contentsWrappers];
    // …
    for (id item in mumble) {
        NSString * filename = [item filename];
        NSData * data = [item data];
        [localizedWrapper addRegularFileWithContents:data
                                   preferredFilename:filename];
    }
    [contentsWrapper addRegularFileWithContents:[self infoPlistData]
                              preferredFilename:@"Info.plist"];
    [pool drain];
    [bundleWrappers setObject:contentsWrapper
                       forKey:@"Contents"];
    NSFileWrapper * bundleWrapper =
    [[[NSFileWrapper alloc] initDirectoryWithFileWrappers:bundleWrappers] autorelease];
    return bundleWrapper;
}

الآن عندما يتم تحرير مستند الحزمة ، يحتفظ التطبيق بأي ملفات لم يضفها إلى الحزمة ، بما في ذلك قطع أثرية SCM وتوطين "Oneal"!

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