objective-c - 在 NSDocument 架构中打开文档之前进行验证

标签 objective-c cocoa nsdocument

我有一个基于文档的应用程序,用于格式化 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;  
}  

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

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

最佳答案

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

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

关于objective-c - 在 NSDocument 架构中打开文档之前进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1294056/

相关文章:

objective-c - 自动布局:当窗口大小调整时如何更改框架的原点?

macos - 如何禁用 NSDocument 中的 NSUndoManager?

Cocoa 应用程序在停用时隐藏

swift - 如何判断 NSWindow 是否被用于浏览文档版本(版本浏览器 UI 右侧)

ios - 如何以编程方式从 pc 获取 iphone 当前屏幕截图?

ios - ViewModel 完成操作时在 ViewController 中的通知

objective-c - 使用 IMKit(或类似的)拦截 Command+key

cocoa - 按下按键时发出不需要的蜂鸣声

objective-c - Cocoa:从webview获取URL

objective-c - 在 Cocoa 中子类化时重写委托(delegate)方法