iOS - 模态Model视图跳转和Push视图跳转的混合需求实现原理

  在研发中总会遇到一些莫名的需求,本着存在即合理的态度跟你们分享一下"模态Model视图跳转和Push视图跳转的需求实现",本文仅仅传授研发技术不传授产品以及UE的思想,请你们合理对待;推荐干货:一键合成APP引导页,包含不一样状态下的引导页操做方式,同时支持动态图片引导页和静态图片引导页以及视频引导页;GitHub地址: https://github.com/dingding3w/DHGuidePageHUD (多多Star,多多支持😊);git

  (一)连续两次模态Model视图以后,而后返回首页(A -> B -> C -> A)github

    ①效果图展现:安全

    

    ②实现思想解读:ide

    一开始你们的思惟确定是一层一层的推出控制器,对这是最直接的办法,可是Apple的工程师思惟非同凡响,其实你只须要解散一个Modal View Controller就能够了;即处于最底层的View Controller,这样处于这个层之上的ModalView Controller通通会被解散;那么问题在于你如何获取最底层的View Controller,若是是iOS4.0,你可使用parentViewController来得到当前Modal ViewController的“父View Controller”并解散本身;若是是iOS 5,你就得用presentingViewController了;学习

    ③核心代码展现:ui

/** 在C页面的DisMiss方法里面添加一下代码(iOS5.0) */
if ([self respondsToSelector:@selector(presentingViewController)]) { [self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES]; } else { [self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES]; } /** 在C页面的DisMiss方法里面添加一下代码(iOS6.0+) */
if ([self respondsToSelector:@selector(presentingViewController)]){ [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil]; } else { [self.parentViewController.parentViewController dismissViewControllerAnimated:YES completion:nil]; }

 

  (二)在模态Model推出的视图中Push下一个带导航栏的视图,而后返回首页(A -> B ->C -> A)spa

    ①效果图展现:3d

    

    ③实现思想解读:代理

    若是没有UINavigationController导航栏页面之间切换是不能实现Push操做的,那咱们平时见得无导航栏Push到下一页是怎么实现的呢? 如今跟你们分享一下实现原理, 就是在第一次Model出来的控制器提早包装一个导航栏,并在Model出来控制器实现UINavigationController的代理方法,UINavigationControllerDelegate判断当前Model出来的控制器是否为自身控制器,这样作的目的就是为了更安全的隐藏该隐藏的控制器导航栏;虽然导航栏隐藏了,可是做为导航栏的属性仍是存在的,因此咱们如今就能够不知不以为在Model出来的控制器里面Push出下一个页面,并且下一个页面仍是带导航栏的,这样Push出来的控制器,不只没有消失原有的Pop功能操做,并且还能够实现DisMiss操做;code

    ③核心代码展现:

/** 这里用到的核心处理办法是 */
/** 1.在A控制器模态Model推出B控制器的时候先给B控制器包装一个导航控制器 */ UINavigationController *ANavigationController = [[UINavigationController alloc] initWithRootViewController:[[BViewController alloc] init]]; [self presentViewController:ANavigationController animated:YES completion:nil]; /** 2.在B控制器遵照UINavigationControllerDelegate实现代理协议,隐藏当前控制器的导航栏 */
#pragma mark - UINavigationControllerDelegate
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { // 判断要显示的控制器是不是自身控制器
    BOOL isShowMyController = [viewController isKindOfClass:[self class]]; [self.navigationController setNavigationBarHidden:isShowMyController animated:YES]; } #pragma mark - Push出C控制器 [self.navigationController pushViewController:[[CViewController alloc] init] animated:YES]; /** 3.在C控制器里面可直接在返回按钮方法里DisMiss */ [self.navigationController dismissViewControllerAnimated:YES completion:nil];

 

  (三)相关相似问题会陆续添加,但愿你们相互补充相互学习;

相关文章
相关标签/搜索