Версии NSDocument имеют странное поведение - PullRequest
2 голосов
/ 04 марта 2012

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

В моем подклассе 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 ]

2 голосов
/ 06 марта 2012

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

- (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 голос
/ 06 марта 2012

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

...