为了账号安全,请及时绑定邮箱和手机立即绑定

多级Push页面后优雅的返回指定控制器几种方法

标签:
iOS

       在开发过程中我们可能会遇到不同的产品需求,例如说A-->B--C,如果是层级返回的话我们只需要pop回去就好,但是如果是back到指定VC的时候,例如:A-->B--C,然后从C回到A,在开发过程中还是遇到的比较多的,本文总结了常见的三种方法,以此记录一下。


> 使用场景:  A -- > B -- > C,然后现在要求C直接pop回到A。

## 方法一

> C返回到B的时候写个回调,B接收到回调再自己pop到A,但是这个方法B的页面会闪现一下,用户体验不好,不推荐。


![方法一.gif](https://upload-images.jianshu.io/upload_images/4905848-e5cd66f226e6b509.gif?imageMogr2/auto-orient/strip)


实现代码:

` C_ViewController.h `

```

#import <UIKit/UIKit.h>

typedef void (^backBlock)(void);     


@interface C_ViewController : UIViewController

@property (copy,nonatomic)backBlock backBlock;


@end

```

` C_ViewController.m `

```

-(void)back

{


    if (self.backBlock) {

        [self.navigationController popViewControllerAnimated:YES];

        self.backBlock();

        

    }

}

```

` B_ViewController实现方法 `

```

   C_ViewController *cViewController = [[C_ViewController alloc] init]; 

    [self.navigationController pushViewController:cViewController animated:YES];

    cViewController.backBlock = ^{

        [self.navigationController popViewControllerAnimated:YES];

    };

```

## 方法二

> 在B push 到C的时候,直接把B从导航控制器的堆栈中移除。


![方法二.gif](https://upload-images.jianshu.io/upload_images/4905848-d401cbb31eb40ce9.gif?imageMogr2/auto-orient/strip)


实现方法:

` B_ViewController实现方法 `

```

    //  方法二

    NSMutableArray *arrM = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];

    [arrM replaceObjectAtIndex:[arrM count]-1 withObject:cViewController];

    [self.navigationController setViewControllers:arrM animated:YES];

   

```

## 方法三

> 写一个UIViewController的catrgory,在C的backAct方法中使用


![方法三.gif](https://upload-images.jianshu.io/upload_images/4905848-d066c1afd0093a64.gif?imageMogr2/auto-orient/strip)

实现方法:

` UIViewController+BackToViewController.h `

```

#import <UIKit/UIKit.h>


@interface UIViewController (BackToViewController)

-(void)backToController:(NSString *)controllerName animated:(BOOL )animaed;

@end


```

` UIViewController+BackToViewController.m `

```

@implementation UIViewController (BackToViewController)

-(void)backToController:(NSString *)controllerName animated:(BOOL)animaed{

    if (self.navigationController) {

        NSArray *controllers = self.navigationController.viewControllers;

        NSArray *result = [controllers filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id  _Nullable evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {

            return [evaluatedObject isKindOfClass:NSClassFromString(controllerName)];

        }]];

        if (result.count > 0) {

            [self.navigationController popToViewController:result[0] animated:YES];

        }

    }

}

```

` 在C_ViewController中使用 `


```

    // 方法三

        if(self.navigationController.viewControllers.count <= 1)

        {

            [self dismissViewControllerAnimated:YES completion:nil];

        }

        else

        {

            [self backToController:@"ViewController" animated:YES];

        }

```

> 这是我个人用的三种方法,比较推荐第三种方法,如有更好的方法麻烦告知,大家共同进步,谢谢。


[代码传送门](https://github.com/chuzhaozhi/PushAndBackDemo)

[更多文章](http://chuzhaozhi.cn/)


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消