【问题标题】:What is the correct way to handle an error in awakeFromNib?处理 awakeFromNib 错误的正确方法是什么?
【发布时间】:2013-09-10 22:49:51
【问题描述】:

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

总结:

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

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

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

【问题讨论】:

  • 不要迂腐,但窗口控制器不会从笔尖加载任何东西,直到第一次发送 -window 消息(这反过来又调用 -loadWindow,这不是直接调用)。
  • 哦,是的,谢谢。我立即致电 [self.window makeKeyWindow]。我会更新问题。

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


【解决方案1】:

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 属性来有条件地显示错误。也可以在 NSResponder 继承类上覆盖 -willPresentError:,您可以在其中自定义演示文稿的内容。

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

祝你工作顺利。

【讨论】:

  • 出现错误的方法(我创建了 NSError)是 awakeFromNib,我无法真正从中返回错误。我可以轻松地将错误呈现给用户,但不知道如何摆脱所有对象(其中一些可能还不可见)。
  • @DanielGibbs 如果您从 nib 或 xib 实例化模型对象,它们就属于那个。不要试图释放它们;当它被释放时,它们会与你的窗口控制器一起消失。
  • 好的。我尝试删除对窗口控制器的所有引用,但我一定错过了一些。这是处理awakeFromNib 中错误的正确方法吗?
  • @DanielGibbs 你确实有我的优势,因为我不知道你在-awakeFromNib 里面到底在做什么。但是,如果您在那里创建自己的 NSError 实例,那么您可以从那里呈现它们,就像我在答案中描述的那样。
  • 当然,但我想弄清楚的是,这是否是在 Cocoa 中做这类事情的推荐/正确方法,或者我是否应该重组我的应用程序并以不同的方式做.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 2017-09-20
  • 2021-12-16
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多