在awakeFromNib中处理错误的正确方法是什么?

时间:2013-09-10 22:49:52

标签: objective-c cocoa model-view-controller

在我的主应用程序(MyApp)中,我通过创建窗口控制器的新实例(MyWindowController)以编程方式创建其他窗口。初始化窗口控制器时,它通过调用[self.window makeKeyWindow]从nib文件加载窗口和其他视图/对象。在其中一个对象(awakeFromNib)上的MyModel方法中,有一些代码可能会失败(由于名称解析),我想向用户显示错误,并销毁窗口控制器,窗口和所有相关对象。

总结:

  1. 应用程序会创建MyWindowController
  2. 的新实例
  3. MyWindowController通过调用[self.window makeKeyWindow]从nib文件加载窗口和其他视图/对象。
  4. awakeFromNib期间,其中一个对象(MyModel的实例)遇到失败(由于名称解析)。
  5. 向用户显示一条错误消息,MyWindowControllerMyModel的实例以及所有其他相关实例将被销毁。
  6. 我如何以最可可行的方式完成第4步?

    只是为了澄清:我知道如何使用NSError向用户呈现错误。我试图找出在awakeFromNib中处理错误的推荐/正确方法是显示错误并从awakeOnNib内释放所有内容,或者是否有更好的方法({1}}可能需要重组我的应用程序。)

1 个答案:

答案 0 :(得分:2)

出现错误的最残酷的Cocoa方式是使用-[NSResponder presentError:]

如果发出此消息的对象继承自NSResponder,则可以使用:

[self presentError:someError];

如果没有,你可以使用它:

[[NSApplication sharedApplication] presentError:someError];

或者:

[NSApp presentError:someError];

还有-presentError:的变体可让您将错误显示为窗口模式表而不是应用程序模式对话框。

所有这一切都假定您以某种方式获得NSError的实例作为someError传递。我不熟悉你的模型对象。当你说它“遇到失败”时,这是否意味着你的模型类上的某些方法提供了这个错误对象?或者在将模型对象作为参数的其他对象上的方法是否提供错误?在任何一种情况下,提供错误对象的方法都应遵循以下形式:

- (BOOL)myMethodReturningAnErrorByReference:(NSError **)error

- (id)myMethodReturningAnErrorByReference:(NSError **)error

在前一个示例中,该方法返回YESNO,如果是NO,则应通过引用返回NSError的实例,然后可以出席。在后一个示例中,您的方法返回对对象的有效引用,或者返回nil,而在nil的情况下,同样返回NSError的实例参考,然后你可以呈现。

此外,您可以通过检查其codedomain属性来有条件地显示错误。您也可以在-willPresentError:继承类上覆盖NSResponder,您可以在其中自定义演示文稿的内容。

最后,Apple的在线文档中的this page提供了丰富的背景信息。我完全掩盖了用于呈现错误的错误响应链,但它已经涵盖在那里。

祝你工作顺利。