【问题标题】:NSDocument Versions has weird behaviorNSDocument 版本有奇怪的行为
【发布时间】:2012-03-04 05:49:09
【问题描述】:

保存和打开文件工作完美,但是在选择“恢复到保存”时,在Windows(上一个文档)的右侧时,我的文档版本的眨眼就会看到,然后只是空白副本。 如果我从这个 blah 副本中恢复,注释会发生变化,但如果我保存并重新打开文档,它会恢复到以前的版本。我不确定它是如何发生的。 我已经查看了 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 来解决版本浏览器行为。所以现在我可以看到文档版本。呸!

仍然在点击恢复时,我的文档没有得到更新,只有在关闭和重新打开它们时才会显示。一定有一些我不知道的更新代码。 所以还在寻找!

【问题讨论】:

    标签: cocoa save nsdocument versions revert


    【解决方案1】:

    最后一切都在版本中工作: 我正在使用这种方法:

    - (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];
      }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 尼克,谢谢。我确实尝试了- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError 方法,但仍然没有解决。但是从您的链接(谢谢:),他使用了 File Wrapper,可能是 Apple 将所有这些版本绑定在一个包装器中,因此获取它们的唯一方法是使用那个。我会在几个小时内试试这个,然后告诉你。
      • 还有 Nickkk,我还不能投票给你,我的声望不是 15。对不起!
      猜你喜欢
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-01
      • 2021-02-07
      • 2016-05-08
      • 2019-03-17
      相关资源
      最近更新 更多