Добре, мисля, че разбрах. Както се оказа, всъщност не беше проблем с версията. Изглежда, че просто сте добавяли нов файл всеки път. Първо, няколко бележки.
- Изглежда не създавате файл в пакет, а „директория, съдържаща файл“ в пакет. Това ли възнамерявахте да направите?
- Изглежда, че ако директорията "default" не съществува, създавате и използвате директория "someFile.ext", което означава, че следващия път създава нова директория със странен префикс. Виждам обаче от вашата екранна снимка, че вече имате директория „по подразбиране“, което означава, че това не е ваш проблем.
Сега вашият действителен проблем: според тази документация, addRegularFileWithContents
създава нов файл с предпочитаното от вас име на файл, освен ако директорията (defaultWrapper
) вече съдържа файл с това име (основно). Ако вече има, той създава нов файл с префикс. addRegularFileWithContents
връща идентифициращ низ, отнасящ се до създадения NSFileWrapper (мисля, че това е името на файла).
И така, това, което се случва, е, че всеки път, когато отидете да запазите файла, той вижда, че вече има файл с това име, и създава нов с префикс. Един от начините за решаване на това е да запазите NSString, върнат от addRegularFileWithContents
, след което, когато отидете да запазите, проверявате defaultWrapper
и премахвате NSFileWrapper, свързан със съхранения NSString, ако има такъв, и след това добавяте файла както обикновено. Промених вашия код, както следва:
@interface TestDocument () // Relevant part of my test class. Note `wrapperFileName`.
@property (nonatomic, strong) NSFileWrapper *documentFileWrapper;
@property (nonatomic, strong) NSString *wrapperFileName;
@end
- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError **)outError
{
if (!self.documentFileWrapper) {
NSFileWrapper *documentFileWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil];
[self setDocumentFileWrapper:documentFileWrapper];
}
NSFileWrapper *defaultWrapper = [self.documentFileWrapper.fileWrappers objectForKey:@"default"];
if (!defaultWrapper) {
defaultWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil];
[defaultWrapper setPreferredFilename:@"default"];
[self.documentFileWrapper addFileWrapper:defaultWrapper];
} else if (self.wrapperFileName) {
[defaultWrapper removeFileWrapper:[[defaultWrapper fileWrappers] objectForKey:self.wrapperFileName]];
}
self.wrapperFileName = [defaultWrapper addRegularFileWithContents:[@"blah blah" dataUsingEncoding:NSUTF8StringEncoding] preferredFilename:@"someFile.txt"];
return self.documentFileWrapper;
}
- Промених предпочитаното име на файл на
defaultWrapper
да бъде "по подразбиране", както подозирам, че сте възнамерявали.
- Добавих блок
if
, който премахва предварително запазения файл, ако е съществувал такъв.
- Накарах го да съхранява името на файла на новия NSFileWrapper, за използване следващия път в #2.
След тези промени програмата демонстрира това, което според мен е поведението, което очаквате: една директория, съдържаща един файл, дори след многократно записване. Имайте предвид, че това беше вярно дори когато preservesVersions
върна YES
. Не съм сигурен къде съхранява версиите си, но не ги видях.
person
Erhannis
schedule
07.03.2014
+ (BOOL)preservesVersions
Върната стойност ДА, ако получаващият подклас на NSDocument поддържа версии; иначе НЕ. - person Oleg Sobolev   schedule 03.03.2014+ (BOOL)preservesVersions
върне НЕ, независимо какво връща+ (BOOL)autosavesInPlace
. Промяната на връщаните стойности на тези две функции засяга активираните опции в менюто, така че те се се запитват. Ще ви уведомя, ако намеря още нещо. - person Erhannis   schedule 08.03.2014