在我的主应用程序(MyApp
)中,我通过创建窗口控制器的新实例(MyWindowController
)以编程方式创建其他窗口。初始化窗口控制器时,它通过调用[self.window makeKeyWindow]
从nib文件加载窗口和其他视图/对象。在其中一个对象(awakeFromNib
)上的MyModel
方法中,有一些代码可能会失败(由于名称解析),我想向用户显示错误,并销毁窗口控制器,窗口和所有相关对象。
总结:
MyWindowController
。MyWindowController
通过调用[self.window makeKeyWindow]
从nib文件加载窗口和其他视图/对象。awakeFromNib
期间,其中一个对象(MyModel
的实例)遇到失败(由于名称解析)。MyWindowController
,MyModel
的实例以及所有其他相关实例将被销毁。我如何以最可可行的方式完成第4步?
只是为了澄清:我知道如何使用NSError
向用户呈现错误。我试图找出在awakeFromNib
中处理错误的推荐/正确方法是显示错误并从awakeOnNib
内释放所有内容,或者是否有更好的方法({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
在前一个示例中,该方法返回YES
或NO
,如果是NO
,则应通过引用返回NSError
的实例,然后可以出席。在后一个示例中,您的方法返回对对象的有效引用,或者返回nil
,而在nil
的情况下,同样返回NSError
的实例参考,然后你可以呈现。
此外,您可以通过检查其code
和domain
属性来有条件地显示错误。您也可以在-willPresentError:
继承类上覆盖NSResponder
,您可以在其中自定义演示文稿的内容。
最后,Apple的在线文档中的this page提供了丰富的背景信息。我完全掩盖了用于呈现错误的错误响应链,但它已经涵盖在那里。
祝你工作顺利。