保存和打开文件非常完美,但是当选择“还原保存”时,在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
,从而解决了浏览器的版本问题。所以现在我可以看到文档版本。呼!
仍在进行恢复时,我的文档不会更新,只有在关闭并重新打开它们时才会显示。必须有一些我不知道的更新代码。 所以还在寻找!
答案 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。