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

时间:2015-08-18 06:26:10

标签: ios objective-c swift uiviewcontroller appdelegate

我在客户端/服务器应用程序中有许多UIViewControlers。在任何时候(在每个屏幕上)服务器可能会发送一般错误,如错误的协议序列,反序列化错误等。有没有办法在AppDelegate中处理此错误,例如并显示某些消息并转到某个屏幕,具体取决于错误?

目前,当我收到错误时,我发送的事件由AppDelegate处理,它找到最顶层的UIViewController并显示Alert消息。问题是: 1.我想要切换到特定的GeneralErrorsViewController,以便在错误解决之前停止处理任何内容,或者只是停止并根据错误为用户提供选择 2.当我显示消息时,如果存在挂起的segue操作,它将切换到下一个UIViewController并且消息将丢失。

2 个答案:

答案 0 :(得分:2)

在一个常见的地方没有建立的处理错误的方法。我希望你意识到这是有道理的,因为系统不会知道你想要处理什么类型的错误,以及你是否希望所有这些错误都以相同或不同的方式处理,例如警告高优先级错误等等。视图控制器启动不同的工作流程,因此应该有自己的方法来处理错误。例如,如果您在后台进程中进行Web服务调用,则当用户处于重要金融交易的中途时,您可能不希望显示该进程中的错误,因为它可以显示来自一般主页的错误/设置屏幕等。

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

由于您需要一种常见的处理错误的方法,您可以使用默认方法创建一个基本视图控制器来处理错误,并从中继承所有其他视图控制器。更好的是,创建一个声明所有错误处理方法的协议(接口)并创建一个自定义的UIVeiwController和UITableViewController,它们以您想要的默认方式实现这些方法。 您可以从基类继承所有视图控制器和表视图控制器。

我建议不要使用'segue'来显示基类中的视图控制器,因为所有的视图控制器都没有这个segue。相反,使用它的storyboard id实例化你的GeneralErrorsViewController,检查调用视图控制器是否有一个非零导航控制器并将其推入堆栈。如果导航控制器为零,则以模态显示。

这种方法有两个优点。 1.错误处理是您想要的集中处理。 2.如果您的应用程序要求需要一个不处理错误的屏幕来以其他方式处理它们,您可以不从基类继承它,也可以继承并覆盖协议方法以满足您的需要。

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

答案 1 :(得分:0)

可能你必须使用尝试捕获 tyo处理错误,

  

如下例

   CabCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CabCell" forIndexPath:indexPath];

        //Set Button Image

        @try {
            [cell.btnCell setImageForState:UIControlStateNormal withURL:[NSURL URLWithString:[[dictBookPagelist[@"data"] objectAtIndex:indexPath.row] valueForKey:Param_vLogo]]];
        }
        @catch (NSException *exception) {
            NSLog(@"%@", exception.reason);
        }
        @finally {

            UIImageView *imageview=[UIImageView new];
            [imageview setImageWithURL:[NSURL URLWithString:[[dictBookPagelist[@"data"] objectAtIndex:indexPath.row] valueForKey:Param_vLogo]] usingActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
            [cell.btnCell setImage:imageview.image forState:UIControlStateNormal];
        }