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

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

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

    ①效果图展示:

    

    ②实现思想解读:

    一开始大家的思维肯定是一层一层的推出控制器,对这是最直接的办法,但是Apple的工程师思维非同凡响,其实你只需要解散一个Modal View Controller就可以了;即处于最底层的View Controller,这样处于这个层之上的ModalView Controller统统会被解散;那么问题在于你如何获取最底层的View Controller,如果是iOS4.0,你可以使用parentViewController来获得当前Modal ViewController的“父View Controller”并解散自己;如果是iOS 5,你就得用presentingViewController了;

    ③核心代码展示:

/** 在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)

    ①效果图展示:

    

    ③实现思想解读:

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

    ③核心代码展示:

/** 这里用到的核心处理办法是 */
/** 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];

 

  (三)相关类似问题会陆续添加,希望大家相互补充相互学习;

转载于:https://www.cnblogs.com/dingding3w/p/6222626.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【课程特点】1、231节大容量课程:包含了SwiftUI的大部分知识点,详细讲解SwiftUI的方方面面;2、15个超级精彩的实例:包含美食、理财、健身、教育、电子商务等各行业的App实例;3、创新的教学模式:手把手教您SwiftUI用户界面开发技术,一看就懂,一学就会;4、贴心的操作提示:让您的眼睛始终处于操作的焦点位置,不用再满屏找光标;5、语言简洁精练:瞄准问题的核心所在,减少对思维的干扰,并节省您宝贵的时间;6、视频短小精悍:即方便于您的学习和记忆,也方便日后对功能的检索;7、齐全的学习资料:提供所有课程的源码,在Xcode 11 + iOS 13环境下测试通过; 更好的应用,更少的代码!SwiftUI是苹果主推的下一代用户界面搭建技术,具有声明式语法、实时生成界面预览等特性,可以为苹果手机、苹果平板、苹果电脑、苹果电视、苹果手表五个平台搭建统一的用户界面。SwiftUI是一种创新、简单的iOS开发中的界面布局方案,可以通过Swift语言的强大功能,在所有的Apple平台上快速构建用户界面。 仅使用一组工具和API为任何Apple设备构建用户界面。SwiftUI具有易于阅读和自然编写的声明式Swift语法,可与新的Xcode设计工具无缝协作,使您的代码和设计**同步。自动支持动态类型、暗黑模式、本地化和可访问性,意味着您的**行SwiftUI代码已经是您编写过的非常强大的UI代码了。 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值