iOS开发Push和Present混用返回指定控制器

来源:互联网 发布:斗鱼裴语燕 知乎 编辑:程序博客网 时间:2024/05/29 03:00

iOS开发中present和push混合跳转返回指定控制器的两种情况:

第一种:

      push     push     present   A -----> B -----> C --------> D

在D界面的返回点击事件:

/**

 由 D 界面返回到 B 界面 点击事件(模态控制器-D 发送popToB通知 导航控制器-C 接收通知触发事件pop回到导航控制器-B)

    push     push     present

 A -----> B -----> C --------> D

 */

-(void)backAction

{

    //触发上一级导航控制器通知,pop回指定界面

    [[NSNotificationCenterdefaultCenter]postNotificationName:@"popToB"object:nil];

    //dismiss当前模态控制器(不加动画)

    [selfdismissViewControllerAnimated:NOcompletion:nil];

}

在C界面的代码:

#pragma mark - 生命周期

- (void)viewDidLoad {

    [superviewDidLoad];

    

    self.title =@"C";

    self.view.backgroundColor = [UIColorbrownColor];

    

    UIButton * pushBtn = [UIButtonbuttonWithType:UIButtonTypeCustom];

    [pushBtn setTitle:@"presentToD"forState:UIControlStateNormal];

    [pushBtn setTitleColor:[UIColorwhiteColor]forState:UIControlStateNormal];

    pushBtn.backgroundColor = [UIColorcyanColor];

    pushBtn.layer.cornerRadius =5;

    pushBtn.frame = CGRectMake(120, 120, 120, 60);

    [pushBtn addTarget:selfaction:@selector(presentAction)forControlEvents:UIControlEventTouchUpInside];

    [self.viewaddSubview:pushBtn];

    

    //添加接收通知的观察者(popToB事件)

    [[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(notiPopToB)name:@"popToB"object:nil];

}

#pragma mark - 事件响应

/**

 pop到指定界面B 通知响应事件

 */

-(void)notiPopToB

{

    for (UIViewController *subVCinself.navigationController.viewControllers) {

        if ([subVC isKindOfClass:[BViewController class]]) {

            [self.navigationControllerpopToViewController:(BViewController *)subVCanimated:YES];

        }

    }

}

/**

 present到D 点击事件

 */

-(void)presentAction

{

    DViewController *DVC = [[DViewControlleralloc]init];

    [selfpresentViewController:DVCanimated:YEScompletion:nil];

}

/**

 注意:注销观察者

 */

-(void)dealloc

{

    [[NSNotificationCenterdefaultCenter]removeObserver:selfname:@"popToB"object:nil];

}

第二种:

      push     present     present     present   A -----> B --------> C --------> D --------> E
在E界面的返回事件:

/**

 由 E 界面返回到 C 界面 点击事件(模态控制器-C)

    push     present     present     present

 A -----> B --------> C --------> D --------> E

 */

-(void)backActionToCC

{

    //获取到当前控制器的父控制器

    UIViewController *superVC =self.presentingViewController;

    //CCViewController要跳转的界面(模态控制器)

    while (![superVC isKindOfClass:[CCViewController class]]) {

        superVC = superVC.presentingViewController;

    }

    [superVC dismissViewControllerAnimated:YEScompletion:nil];

}

/**

 由 E 界面返回到 B 界面 点击事件(导航控制器-B 继承于导航控制器-BaseNavigationVC,经log打印 C的模态父级控制器是 BaseNavigationVC* ,而不是 BViewController* ,所以这里判断将 BViewController 改为了 BaseNavigationVC )

    push     present     present     present

 A -----> B --------> C --------> D --------> E

 */

-(void)back2ActionToBB

{

    //获取到当前控制器的父控制器

    UIViewController *superVC =self.presentingViewController;

    //BBViewController要跳转的界面(导航控制器)

    while (![superVC isKindOfClass:[BaseNavigationVC class]]) {

        superVC = superVC.presentingViewController;

    }

    [superVC dismissViewControllerAnimated:YEScompletion:nil];

}



阅读全文
1 0