2012-03-04 5 views
2

Сохранение и открытие файла отлично работает, но при выборе «Восстановить, чтобы сохранить», в правой части окна (предыдущие документы) на мгновение мои версии документа видны только пустые копии. И если я вернусь из этого списка заметок blah, будет изменен, но если я сохраню и снова открою документ, он будет восстановлен до предыдущей версии. Я не уверен, как это происходит. Я проверил официальный документ Apple и видео WWDC, но я не близок к решению этого вопроса. Пожалуйста, помогите?Версии NSDocument имеют странное поведение

В моем NSDocument подклассу я реализовал это методы:

+ (BOOL)autosavesInPlace { return YES; } 
+ (BOOL)preservesVersions { return YES; } 

и чтение из файла делается:

- (BOOL)readFromURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError { 

if ([typeName compare:@"public.plain-text"] == NSOrderedSame) { 
    doucmentString = [[NSString alloc] initWithContentsOfURL:absoluteURL encoding:NSUTF8StringEncoding error:outError]; 
return YES; 
} 
if (outError != NULL) { 
    *outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL]; 
} 
return NO; 
} 

И контроллер для Windows сделал нагрузки я устанавливаю строку MyDocument которая является IBOutlet к NSTextView:

- (void)windowControllerDidLoadNib:(NSWindowController *)aController 
{ 
[super windowControllerDidLoadNib:aController]; 
[myDocument insertText:doucmentString]; 
[self updateChangeCount:NSChangeAutosaved]; 
} 

UPDATE:

Я решил поведение браузера версии, переместив код windowsControllerDidLoadNib на awakeFromNib. Теперь я вижу версии документа. Уф!

По-прежнему при удалении восстановления мой документ не обновляется, только при закрытии и повторном открытии они отображаются. Должен быть некоторый код обновления, о котором я не знаю. Так что все еще смотри!

ответ

2

Наконец, все работает в версиях: Я использую этот метод:

- (BOOL)revertToContentsOfURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError { 
    if(absoluteURL != NULL) { 
    doucmentString = [[NSString alloc] initWithContentsOfURL:absoluteURL encoding:NSUTF8StringEncoding error:outError]; 
    return YES; 
    } else if (outError) { 
     //do nothing 
    } 
    return NO; 
    } 

, а также изменил мой awakeFromNib метод, вместо insertText теперь я использую insertTextreplacementRange

-(void) awakeFromNib 
{ 
    if (documentString != NULL) { 
    [myDocument insertText:doucmentString replacementRange:NSMakeRange(0, [[myDocument textStorage]length])]; 
    [self updateChangeCount:NSChangeAutosaved]; 
    } 
} 
1

Чтобы обновить документ после восстановления версии, один из методов вызова - - (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError, который также вызывается при открытии нового документа. Чтобы узнать, вызван ли этот метод при восстановлении версии, я использую, чтобы проверить, установлен ли какой-либо IBOutlet (т. Е. MyOutlet! = Nil). Могут быть другие способы достижения этого, поэтому дайте мне знать, если найдете одно :-) Вы также можете обратиться к this post.

+0

Nickkk, спасибо. Я попробовал данные read: * (BOOD) readFromData: (NSData *) типа Type: (NSString *) typeName: (NSError **) outError', но до сих пор не решен. Но из вашей ссылки (спасибо :), он использовал File Wrapper, может быть, Apple связывает все эти версии в оболочке, поэтому использовать их можно только для их использования. Я попробую это через несколько часов и дам вам знать. – Raj

+0

и Nickkk, я еще не могу вас проголосовать, моя репутация не является 15. Извините! – Raj