0

我有一个基于文档的应用程序,它可以格式化 XML 文件。

文档的编写和阅读在我的 NSDocument 子类中完成

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

但如果文件是无效的 XML,我的应用程序就会崩溃。

所以我实现了:

- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename  
{  
  if(safe){open new document using .....makeDocumentWithContentsOfURL:......}  
   else{present alert}  
}

但这有很多明显的副作用。我必须覆盖其他几个方法:

-(BOOL)writeSafelyToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName     forSaveOperation:(NSSaveOperationType)saveOperation error:(NSError **)outError  
{  
    return [self writeToURL:absoluteURL ofType:typeName error:outError];  
    //return YES;  
}  

这就是沙滩球光标出现的地方,最终应用程序变得无响应。

有没有更好的方法在打开之前验证文档?

4

3 回答 3

2

您应该实现-readFromURL:ofType:error:它不会在错误的 XML 上崩溃。这是您应该进行验证的例程。您的代码的哪一部分导致了崩溃,它是什么类型的崩溃?

关于 中的沙滩球-writeSafelyToURL:ofType:forSaveOperation:error:,您可能正在创建一个无限循环。有可能-writeToURL:ofType:error:调用-writeSafelyToURL:..... 无论如何,这是一种非常奇怪的超载方式。你想在这里达到什么目的?我不明白重载-application:openFile:与您的第一个问题或您描述的重载有何关系。

于 2009-08-18T14:10:00.133 回答
1

最好的办法是在你的 application:openFile: 方法中调用它:

[[NSDocumentController sharedDocumentController] openDocumentWithContentsOfURL:[NSURL fileURLWithPath:filename] display:YES error:&error];

使用它我没有任何问题(我也是文档架构的新手)。只需在该行之前进行验证,一切都会正常。

您可能会发现另一件有用的事情:如果您为不同类型覆盖任何 NSDocument 加载/保存方法,如果您不在其中进行保存/加载,请务必在最后调用每个的超级版本。因此,例如,您可以拥有readFromData:ofType:error:一种类型的数据,但可以拥有另一种类型的数据,如果您不处理请求的类型readFromFileWrapper:ofType:error:,只要您在每个结束时调用,两者都会自动工作。[super ...]

于 2010-07-21T22:15:18.653 回答
0

为什么不简单地使用返回码

直接来自文档readFromURL:ofType:error:

如果可以读取文档内容,则返回值YES;
否则,否。

于 2014-10-15T08:49:08.743 回答