首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在一个UIViewController中,我如何判断是返回到下一个UIViewController,还是返回到上一个UIViewController

在一个UIViewController中,可以通过以下方式判断是返回到下一个UIViewController还是返回到上一个UIViewController:

  1. 导航控制器(UINavigationController):如果当前UIViewController是由导航控制器管理的,可以使用导航控制器的方法来判断。导航控制器维护了一个UIViewController的堆栈,可以通过以下方法获取堆栈中的视图控制器:
代码语言:swift
复制
if let viewControllers = self.navigationController?.viewControllers {
    if viewControllers.count >= 2 && viewControllers[viewControllers.count - 2] is NextViewController {
        // 返回到下一个UIViewController
    } else {
        // 返回到上一个UIViewController
    }
}
  1. 模态视图控制器(Presented View Controller):如果当前UIViewController是通过模态方式展示的,可以使用以下方法来判断:
代码语言:swift
复制
if let presentingViewController = self.presentingViewController {
    if presentingViewController is NextViewController {
        // 返回到下一个UIViewController
    } else {
        // 返回到上一个UIViewController
    }
}
  1. 委托模式(Delegate Pattern):如果当前UIViewController是通过委托模式传递数据的,可以在返回前调用委托方法来传递信息:

在上一个UIViewController中定义委托协议:

代码语言:swift
复制
protocol PreviousViewControllerDelegate: class {
    func didReturnToPreviousViewController(from viewController: UIViewController)
}

在下一个UIViewController中设置委托属性并调用委托方法:

代码语言:swift
复制
weak var delegate: PreviousViewControllerDelegate?

func returnToPreviousViewController() {
    delegate?.didReturnToPreviousViewController(from: self)
}

在上一个UIViewController中实现委托方法:

代码语言:swift
复制
extension PreviousViewController: PreviousViewControllerDelegate {
    func didReturnToPreviousViewController(from viewController: UIViewController) {
        if viewController is NextViewController {
            // 返回到下一个UIViewController
        } else {
            // 返回到上一个UIViewController
        }
    }
}

以上是判断返回到下一个UIViewController还是返回到上一个UIViewController的几种常见方法。具体使用哪种方法取决于你的应用架构和需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

# iOS导航栏控制Tips

比如,当页面用户输入了一些内容后,用户要点击返回,想要回到上一个页面时,提醒用户是否要缓存已经输入的内容。 如果我们重写了导航栏的返回按钮,那么处理这种情况就很Easy,不做赘述了。...例如singleTask,在做IM类App,跳转到聊天室的场景,就非常有用,可以保证控制器栈只有一个聊天室,避免返回时层级太深。...原始堆栈数组判断是否存在该类型的控制器,如果存在记录其索引。 复制的数组中将索引及上方所有控制器移除。 把将要push出来的控制器添加到复制的数组。...将新的控制器数组设置为导航控制器的栈数组,根据参数判断是否要显示动画。 这边做了一些发散,因为一些类可能会有很多子类,那么想要保证父类以及子类的实例都只有一个,所以将方法做了改进。...,这样当点击返回或者侧滑时,就直接回到了指定页面了。

1.7K31
  • iOS对UIViewController生命周期和属性方法的解析

    loadView一种错误的方法,apple文档声明对于loadView方法,我们从来都不要手动直接调用,那么我们如何实现创建后对成员对象进行传值设置呢,iOS9增加了这样一个方法: - (void)...iOS9UIViewController还增加了下面一个布尔值的属性,可以同来判断controller的view是否已经加载完成: @property(nullable, nonatomic, readonly...执行过上述方法后,如果返回YES,系统还会在执行如下一个方法,作为跳转前的准备,我们可以在这个方法中进行一些传值操作,这个方法无论使我们手动进行跳转还是storyboard自动跳转,都会被执行: -...我们可以把它连接到viewController2一个按钮上: ? 这样,当我们点击viewController2的按钮时,就会返回到我们第一个ViewController1了。...的模态跳转及动画特效         单纯的UIViewController,我们使用最多的如下的两个方法,一个向前跳转,一个向后返回: - (void)presentViewController:

    3K20

    iOS透明导航栏的平滑过渡(进阶版)引实现过程结

    既然有透明的导航栏也有不透明的导航栏,那一定会在界面切换之间存在一个过渡的过程,而这个过程,QQ做的特别好,在从透明导航栏界面返回到不透明导航栏界面时,导航栏的透明度一个渐进的过渡效果,甚至会有一种毛玻璃的效果...同时,我们虽然说QQ做的很好,但也依然有一些不足,多把玩一下导航栏过渡的过程就会发现,如果准备从透明导航栏返回时又决定不反回了,还是停留在导航栏透明的界面,这时候导航栏虽然会回到透明,但会有一个导航栏闪现一下的小瑕疵...,因为没有给导航栏添加任何其他按钮,所以这里一定是返回按钮,下属的 UILabel 就是 “返回” 两个字了。...,实际的效果也是这样的: 一些小瑕疵的修补 就目前的效果,其实还是不错的,不过也有一些小瑕疵,比如滑动到一半松手时会有一个小跳变,对于这一点,我们可以 UINavigationController...的 Delegate 添加一个处理,监控松手后时自动完成返回还是取消返回操作,同时使用 UIView 动画(关于 UIView 动画可以看我的这篇文章:传送门:iOS基础动画教程),自动操作的那个时间内将透明度变为对应界面的导航栏透明度

    3.1K40

    UINavigationController

    :(BOOL)animated; //回到指定的子控制器 - (NSArray *)popToViewController:(UIViewController *)viewController animated...:(BOOL)animated; //回到根控制器(栈底控制器) - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated; 如何修改导航栏的内容...,一定要跳转到下一个界面,建议使用“自动型Segue” 手动型:需要通过写代码手动执行Segue,才能完成界面跳转 按住Control键,从来源控制器拖线到目标控制器 手动型的Segue需要设置一个标识...,也就是说,这个perform方法必须由来源控制器来调用 如果点击某个控件后,需要做一些判断,也就是说:满足一定条件后才跳转到下一个界面,建议使用“手动型Segue” 利用performSegueWithIdentifier...performSegueWithIdentifier:sender:传入的sender 调用Segue对象的- (void)perform;方法开始执行界面跳转操作 如果segue的stylepush

    1.4K60

    阅读器多种翻页的设计与实现

    doubleSided为YES之后,每次翻页会调用两次viewControllerAfterViewController或viewControllerBeforeViewController,需要特殊返回一个...UIGestureRecognizerStateChanged) { if (self.currentStatus == SSReaderPageEffectViewStatusDefault) { // 用户开始移动,此时判断左移还是右移...1 : 0; // 经验数值,多次尝试得出 另外一个问题手势进行到一半时如果APP切入后台,动画出现暂停的情况。...效果分解: 1、当用户滑动的过程,视图要跟随手指的移动; 2、当用户往上滑然后松开时,视图要带有加速度的往上滑动;(附加特性:滑动过程中用户可以通过重复这个行为加速滑动) 3、视图滑动的过程...A: 这是因为pan手势切后台时会自动cancel,所以需要在手势处理增加对cancel状态的处理; Q:如果初始化的时候,传进的VC.view不满一屏,该如何处理?

    3.3K10

    推送跳转到N级界面 返回那些事

    123.gif 推送点击跳转产品要求是这样的 场景N.01 ==> 假如APP 退到后台A界面(以A界面为rootVC)点击推送直接跳转到C界面,然后C点击返回返回到B界面,B再返回A界面。...234.gif 场景N.02 ==> 假如APP 退到后台B界面(以A界面为rootVC)点击推送直接跳转到C界面,然后C点击返回返回到B界面,B再返回A界面。 ?...345.gif 场景N.03 ==> 假如APP 退到后台C界面(以A界面为rootVC)点击推送直接跳转到C界面,然后C点击返回返回到B界面,B再返回A界面。 ?...的做法如下 在三级界面C控制器的返回事件这样做 - (void)backButtonAction { UINavigationController *navigationController...1]; navigationController.viewControllers = tempViewControllers; } //TODO: 判断自身控制器的个数

    54550

    WSRouter—一款轻量级路由跳转框架

    无论对于项目使用还是学习参考,WSRouter都是一个不错的选择。...每添加一个ViewController我们都要注册一个能够唯一标识这个ViewController的URL到映射表。如果基于URL-block的方案,这个映射表中保存的url-block的关系。...需要注意的,我们block的实现创建了一个对应的控制器实例,然后用URL.query对控制器进行配置。通常,我们将需要传递个目的控制器的参数都拼接到URL.query。...uid=666"]]; 带回调的转场 还是上面那个例子,有时候我们从目的控制器返回到上一个控制器时,需要执行某些回调,我们仅需要把上例的transferFromViewController:toURL:...这样页面退出即可执行回调通知上一个控制器执行一些操作。此外除了viewWillDisappearCallBack之外,WSRouter还支持viewDidDisappearCallBack。

    7.2K30

    iOS 转场动画探究(一)

    自己的建议和理解,转场动画能帮你加深理解、总结你对动画的学习,但不要轻易在你的项目中大量的去尝试,还是觉得动画用的好就有点睛之笔的感觉,但若是大量的使用,很容易给人造成审美和视觉疲劳。...在后面参考博客都会把这些博客链接总结发出来。  ...要是不是nil,就不会走下面这两个方法了, 我们这里也就是用手势测试的时候不会走的,点击present或 者dismiss会走 */ // 这个方法返回一个遵守 <UIViewControllerAnimatedTransitioning...这两个方法我们就不在代码里面添加注释说明了,在这里一句话描述一下:        a:  第一个方法返回动画执行的一个时间,建议设置0.5以内吧。        ...Demo的下载地址在这里给大家,我们现在说的就先是第一种:逐渐出现的转场       前面的用UICollectionView写的那个圈圈,哈哈.....圈圈代码ViewController里面,重要的其实就是每一个

    2.6K50

    【IOS开发基础系列】UIViewController专题

    当程序接收到内存警告时,controller会尝试卸载view,卸载循环中,controller尝试释放它的view对象并返回到原始的无view状态(当它不在屏幕上显示时,这个条件的判断到底根据view...的结构来还是根据用户视觉来,尚不清楚),直到view下次被请求。         ...彻底解决方法:         一个被push的VC的viewDidAppear方法再去push第二个VC。...3.1.4 Demo         还是那句话,一百行的讲解不如一个简单的小Demo,于是..it’s demo time~ 整个demo的代码放到了github的这个页面上,有需要的朋友可以参照着看这篇文章...3.手势结束时,把正在切换的标设置回NO,然后进行判断2我们设定了手势距离超过设定一半就认为应该结束手势,否则就应该返回原来状态。

    57930

    app框架整体设计

    ) 项目功能模块 384CB19E-4141-47C3-8AB5-D93DA9A509DC.png 项目文件结构 项目文件结构.png 每一个模块文件结构相同,模块的Actions与Category...class]]) { // view controller 交付出去之后,可以由外界选择push还是present return viewController; } else {...// 这里处理异常场景,具体如何处理取决于产品 return [[UIViewController alloc] init]; } } - (UIViewController *)IComMediator_DiscoverViewController...实际开发过程可以事先给一个固定的target专门用于在这个时候顶上,然后处理这种请求的 return nil; } if ([target respondsToSelector:action...reSendF=>operation: 失败次数达到上限后判断是否断开连接,做相应处理 reConnect=>operation: tcp断开重新连接机制 reIsSuccess=>condition

    2.1K30

    iOS 自定义转场动画

    模态化present和dismiss 自定义转场 1、创建一个遵循协议的动画过渡管理对象,并实现如下两个方法: //返回动画事件...设置转场代理 self.transitioningDelegate = self; #pragma mark -- UIViewControllerTransitioningDelegate //返回一个处理...self.transitionInteractive : nil; } return nil; } 全屏侧滑返回 创建一个继承于UINavigationController的一个对象WSLNavigatioController...// 判断导航控制器是否只有一个子控制器,如果只有一个子控制器,肯定是根控制器 if (self.childViewControllers.count == 1) { // 表示用户根控制器界面...statebegan还是fail,同时判断scrollView的位置是不是正好在最左边 if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan

    1K90

    iOS 面向协议方式封装空白页功能

    要明白这里的self指的是UIViewController,考虑到UIView的可能,这里就让万物对象之父NSObject来遵守,并实现对应的数据源方法和代理方法 extension NSObject...这里先做出一个限定,我们要使用重载方法来完成该功能,实现即可高定制,又可使用默认定制。 回到刚刚的话题,使用UserDefaults来实现可以吗?...可以,但是比较麻烦,因为UserDefaults单例,整个进程共用这一份资源,如果你当前controller遵守了我们的协议LXFEmptyDataSetable并做出了定制,那么当下一个controller...遵守协议后使用了默认定制时,那你要怎么办?...大功告成 三、开源库 对这个过程进行一次整理,并做成一个名为 LXFProtocolTool 的库并上传至gitHub。

    1.4K50

    iOS多控制器之UINavigationController&UITableBarController1. 多控制器2. UINavigationController3. UITableBarCont

    第一次显示出来的自控制器; 2,addChildViewController:此方法UIViewController的方法,可以用来添加子控制器; 3,通过属性viewControllers进行设置...*)viewController animated:(BOOL)animated; 2.4.3 出栈 返回到上一个控制器(将栈顶的控制器移除) -(UIViewController *)popViewControllerAnimated...:(BOOL)animated; 返回到指定的控制器 ?...UITabBarButtonUITabBar得位置均分的,UITabBar的高度为49。 UITabBar的结构⼤大致如下图所示: ?...:c1]; tb.viewControllers=@[c1,c2,c3,c4]; 注意:展示的顺序和添加的顺序一致,和导航控制器不同,展现在眼前的导航控制器的根视图控制器也就是第一个添加到导航控制器上的视图

    1.3K40

    iOS 自定义转场动画

    模态化present和dismiss 自定义转场 1、创建一个遵循协议的动画过渡管理对象,并实现如下两个方法: //返回动画事件...设置转场代理 self.transitioningDelegate = self; #pragma mark -- UIViewControllerTransitioningDelegate //返回一个处理...self.transitionInteractive : nil; } return nil; } 全屏侧滑返回 创建一个继承于UINavigationController的一个对象WSLNavigatioController...// 判断导航控制器是否只有一个子控制器,如果只有一个子控制器,肯定是根控制器 if (self.childViewControllers.count == 1) { // 表示用户根控制器界面...statebegan还是fail,同时判断scrollView的位置是不是正好在最左边 if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan

    1.3K50

    iOS初步集成极光推送后你还要做这些事

    今天小伙伴问我Badge怎么弄,这边徽章个数从服务器请求的,使用WZLBadge这个三方绘制的。另外,个人遇到的一个崩溃问题 觉得有必要让大家看下。...TSMessage点击消息的时候做了一个跳转。...○未启动时受到消息如何处理?如何跳转 这种情况最不容易找到的,因为当你的应用未启动,点击了通知栏,它没有调用任何极光的代理,这时候需要我们去启动函数进行判断。...,来判断是否收到通知启动的。...自定义消息,这个比较特殊,它必须app正在前台的时候才能收到消息,收到消息的位置而且不在代理,而是一个通知。 ? 当注册极光后可以加入下面代码。注册一个通知。

    2.8K50

    iOS14开发-触摸与手势识别

    方法 // 返回一个CGPoint类型的值,表示触摸view上的位置。 // 返回的位置针对view的坐标系。 // 调用时传入的view参数为空的话,返回触摸点在整个窗口的位置 。...此时需要重写 UITabBar 的point方法,判断当前触摸位置是否中间凸起按钮的坐标范围内,如果在返回 true。这样可以让触摸事件传递到凸起按钮,并让其成为最佳响应者。...响应者对于触摸事件的响应和传递都是touchesBegan方法完成的。该方法默认将事件顺着响应者链向上传递,即将事件交给上一个响应者进行处理。...每一个响应者对象都有一个next属性,用来获取下一个响应者。...默认的next对象为: (1)UIView:若当前响应者 UIViewController 的view,则next UIViewController,否则上一个响应者其父 UIView。

    2.3K20
    领券