NSDocument版本有奇怪的行为

时间:2012-03-04 05:49:10

标签: cocoa save nsdocument versions revert

保存和打开文件非常完美,但是当选择“还原保存”时,在Windows(以前的文档)的右侧眨眼,我的文档版本只会看到空白副本。 如果我从这个复制版本恢复注意事项已更改,但如果我保存并重新打开文档,它将恢复到以前的版本。我不确定它是怎么回事。 我查看了官方的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];
}

更新:

我已将windowsControllerDidLoadNib代码移至awakeFromNib,从而解决了浏览器的版本问题。所以现在我可以看到文档版本。呼!

仍在进行恢复时,我的文档不会更新,只有在关闭并重新打开它们时才会显示。必须有一些我不知道的更新代码。 所以还在寻找!

2 个答案:

答案 0 :(得分: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 :(得分:1)

要在恢复版本后更新文档,其中一个被调用的方法是- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError,当您打开新文档时也会调用它。要知道在恢复我用来检查是否已设置任何IBOutlet的版本时是否调用此方法(即myOutlet!= nil)。可能有其他方式来实现这一点,所以如果你找到一个,请告诉我:-) 您可能还想参考this post