ios - 如何在 iOS 的一个地方处理常见错误(可以在一个地方的每个 UIViewController 中引发)?

标签 ios objective-c swift uiviewcontroller appdelegate

我在客户端/服务器应用程序中有很多 UIViewControler。在任何时候(在每个屏幕上)服务器都可能发送一般错误,例如错误的协议(protocol)序列、反序列化错误等。例如,有没有办法在 AppDelegate 中处理此错误,并根据错误显示特定消息并在特定屏幕上继续显示?

目前,当我收到错误时,我发送由 AppDelegate 处理的事件,它找到最顶层的 UIViewController 并显示警报消息。问题是: 1. 我想转到特定的 GeneralErrorsViewController,以便在错误解决之前停止处理任何事情,或者只是停止并根据错误给用户一个选择 2. 当我显示消息时,如果有待处理的 segue 操作,它会切换到下一个 UIViewController 并且消息丢失。

最佳答案

在一个常见的地方没有内置的错误处理方法。我希望你意识到这是有道理的,因为系统不会知道你想要处理什么类型的错误,也不知道你是否希望所有的错误都以相同的方式或不同的方式处理,比如只对高优先级错误发出警报等。此外,每个 View Controller 启动不同的工作流,因此应该有自己的方式来处理错误。例如,如果您在后台进程中进行 Web 服务调用,您可能不希望在用户进行重要金融交易的过程中显示该进程的错误,因为可以显示来自一般家庭的错误/设置屏幕等

因此,根据您的要求处理应用内的错误是您的责任。

如果您想要一种处理错误的通用方法,您可以创建一个带有默认方法的基本 View Controller 来处理错误,并从中继承所有其他 View Controller 。更好的是,创建一个声明所有错误处理方法的协议(protocol)(接口(interface)),并创建一个自定义的 UIVeiwController 和 UITableViewController,它们以您想要的默认方式实现这些方法。 您可以从基类继承所有 View Controller 和 TableView Controller 。

我建议不要使用“转场”来显示基类中的 View Controller ,因为您的所有 View Controller 都不会有该转场。相反,使用 Storyboard ID 实例化您的 GeneralErrorsViewController,检查调用 View Controller 是否具有非零导航 Controller 并将其推送到堆栈上。如果导航 Controller 为零,则以模态方式显示。

这种方法有两个优势。 1.错误处理是集中的,如你所愿。 2. 如果您的应用要求一个不处理错误的屏幕以其他方式处理它们,您可以不从基类继承它,或者继承并覆盖协议(protocol)方法以满足您的需要。

每个vc 在遇到错误时都可以调用自己的错误处理方法。但是,如果您想在出现错误时继续使用发送事件(通知)的方式,您可以在基础 vc 的 viewWillAppear' 中注册这些通知并在 viewWillDisappear` 中注销并调用从通知处理程序中调用协议(protocol)方法并将错误(您可以将其作为对象与错误通知一起传递)传递给协议(protocol)方法。这样您就不需要在应用程序委托(delegate)中处理任何事情。

关于ios - 如何在 iOS 的一个地方处理常见错误(可以在一个地方的每个 UIViewController 中引发)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32065015/

相关文章:

objective-c - 在函数、objective-c 中使用协议(protocol)中的静态函数

objective-c - objective-c : NSString NSData reading from file problem

ios - 以编程方式创建 UIScrollView

ios - ScrollView - 手势识别器 - 垂直滑动

swift - 弹出模式中的中心堆栈 View

ios - swift 构造一个带有 xml 请求体的请求

ios - Appium检查器未加载

ios - iOS 着色器中的人工制品

ios - 警告 : Attempt to present * on * which is already presenting (null)

ios - 无法将数据加载到自定义 Collection View 中