0

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

总之:

  1. 应用程序创建 的新实例MyWindowController
  2. MyWindowController通过调用从 nib 文件加载窗口和其他视图/对象[self.window makeKeyWindow]
  3. awakeFromNib这些对象之一(的实例MyModel)遇到故障(由于名称解析)。
  4. 向用户显示一条错误消息,并销毁MyWindowControllerMyModel和所有其他相关实例的实例。

我将如何以最可可的方式完成第 4 步?

澄清一下:我知道如何使用NSError. 我试图找出处理错误的推荐/正确方法awakeFromNib是否是显示错误并从内部释放所有内容awakeOnNib,或者是否有更好的方法(可能需要重组我的应用程序)。

4

1 回答 1

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

在前一个示例中,该方法返回YESor NO,在 的情况下,应通过引用返回ofNO的实例,然后您可以呈现该实例。NSError在后一个示例中,您的方法返回对对象的有效引用,或者它返回nil,在 的情况下nil,同样,NSError应该通过引用返回 的实例,然后您可以呈现该实例。

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

最后, Apple 在线文档中的这一页提供了丰富的背景信息。我完全掩盖了用于呈现错误的错误响应链,但它在那里被覆盖。

祝你在你的努力中好运。

于 2013-09-11T00:42:09.243 回答