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

当按下UINavigationController的back bar按钮时执行操作

当按下UINavigationController的back bar按钮时执行操作,通常涉及到iOS开发中的导航控制器(Navigation Controller)的使用。以下是关于这个问题的基础概念、相关优势、类型、应用场景以及解决方案。

基础概念

UINavigationController是iOS开发中用于管理视图控制器(ViewController)栈的容器类。它允许用户通过一系列的视图控制器进行导航,每个视图控制器代表一个界面。back bar按钮(通常显示为“返回”箭头)允许用户返回到前一个视图控制器。

相关优势

  • 简化导航逻辑:通过UINavigationController,开发者可以轻松地管理多个视图控制器的导航逻辑。
  • 一致的UIUINavigationController提供了标准的导航界面,包括返回按钮和标题栏,这有助于保持应用界面的一致性。
  • 支持深度链接:可以方便地实现从外部链接直接打开应用的特定部分。

类型与应用场景

  • 模态展示:除了标准的push/pop导航,UINavigationController还支持模态(modal)展示视图控制器,适用于临时展示某些信息或功能。
  • 嵌套导航:可以在一个导航控制器内部嵌套另一个导航控制器,以实现更复杂的导航结构。

解决方案

要在按下back bar按钮时执行操作,可以通过重写UINavigationControllerviewControllers属性的setter方法或监听UINavigationControllerDelegate的相关方法来实现。

方法一:重写viewControllers属性的setter

代码语言:txt
复制
class CustomNavigationController: UINavigationController {
    override var viewControllers: [UIViewController]? {
        didSet {
            if let previousViewController = oldValue?.last, let currentViewController = viewControllers?.last {
                // 在这里执行你需要的操作
                print("从\(previousViewController)返回到\(currentViewController)")
            }
        }
    }
}

方法二:使用UINavigationControllerDelegate

代码语言:txt
复制
class ViewController: UIViewController, UINavigationControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationController?.delegate = self
    }

    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if let previousViewController = navigationController.viewControllers.first(where: { $0 !== viewController }) {
            // 在这里执行你需要的操作
            print("从\(previousViewController)返回到\(viewController)")
        }
    }
}

参考链接

通过以上方法,你可以在按下UINavigationController的back bar按钮时执行自定义操作。选择哪种方法取决于你的具体需求和应用场景。

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

相关·内容

iOS学习—— UINavigationController返回按钮与侧滑返回手势研究

侧滑返回手势是从iOS7开始增加一个返回操作,经历了两年时间估计iPhone用户大部分都已经忽略了屏幕左上角那个碍眼back按钮了。...之前在网上搜过有关侧滑手势技术博客,发现大多比较散乱,甚至有很多都是简单粘贴复制,并不全面。侧滑返回操作效果与左上角back按钮是一样,所以一起放在这里进行探讨。...导航栏左上角back按钮是附着在UINavigationControllerUINavigationBar里自带一个返回按钮,导航栏自带back按钮图层结构如下图所示。...:[self.navigationController screenEdgePanGestureRecognizer]];  二 导航栏back按钮   在了解导航栏返回按钮之前,我们先了解一导航栏管理导航栏上各类控件...优先级高,存在leftBarButtonItem,自动忽略backBarButtonItem,达到重写backBarButtonItem目的。

6.7K60

UI篇-UINavigationController之易忘补充

---- 对nextVC 进行属性赋值后,执行push跳转,方法执行顺序:  A跳转到B 代码顺序执行: Binit 方法;(此方法中  BnavigationController 不存在...上面设置为YES,下面的为NO 关于导航返回:     首先ios7 之后只要使用系统自带导航效果就有手动滑动返回效果。但是自定义返回按钮,这种手动滑动返回效果就没有了。...要自定义返回按钮,直接设置backBarButtonItem是不行 UINavigationController view层级 ?...每个视图控制器都有一个navigationItem属性,navigationItem中设置按钮、右按钮、标题等,会随着控制器显示,也显示到navigationBar上 我们来看一这些名词是什么意思...因此UINavigationController这两个属性通常情况是一样,但也有可能不同。

2.1K20
  • Cocoa编程中视图控制器与视图类详解

    推入时,新视图控制器从右方滑入屏幕(假定animated:YES)。向左指Back后退按钮出现,可返回到上一步,且Back按钮是上一个视图控制器标题。 2....设置导航栏按钮并不是去设置导航栏本身。一切都是在被推入UIViewController子类内部执行推入请求和相关导航栏定制(如:右键按钮)。...选项卡类方便之处就是不需要象导航栏那样以栈方式推入和弹出视图操作,而是组建一系列控制器(它们各自可以是UIViewController、UINavigationController、UITableViewController...• –viewDidLoad:加载控制器视图到内存,该方法被调用。...事件处理 如图所示,一般情况一个视图不响应用户事件,它会将事件传递给它父视图。但是,视图被视图控制器管理,它会将事件首先传递给视图控制器。

    5.1K50

    解析 SwiftUI 中两处由状态更新滞后引发严重 Bug

    原文发表在我博客 肘子Swift记事本视图变化在前、状态变化在后在 SwiftUI 中,某些可编程控件在执行一定操作,会先更新视图,待视图变化完成后再修改与其对应状态。...再次执行上述过程,您会发现在返回上层视图后,应用并不会锁死,一切都恢复了正常。然而,明显地,强迫用户点击 “Dismiss” 按钮并不是一个好选择,特别是在没有屏蔽手势取消 Sheet 情况。...请至少进入第三级视图滚动当前视图视图处于滚动状态,点击 NavigationStack 左上角Back按钮。...Back 按钮,状态只会在视图已经返回到上一层才会更新。...通过自定义返回按钮以及扩展 UINavigationController 方式,实现了在禁用 Back 按钮后仍支持手势返回,并先修改状态后再进行视图响应。

    711110

    解析 SwiftUI 中两处由状态更新滞后引发严重 Bug

    视图变化在前、状态变化在后 在 SwiftUI 中,某些可编程控件在执行一定操作,会先更新视图,待视图变化完成后再修改与其对应状态。这些控件基本上都是对 UIkit(AppKit)二次包装。...Sheet 执行下面的代码,你可以清楚地看到,在通过手势取消 Sheet ,与其关联状态是在 Sheet 完成取消动画后才发生了改变。...然而,明显地,强迫用户点击 “Dismiss” 按钮并不是一个好选择,特别是在没有屏蔽手势取消 Sheet 情况。...请至少进入第三级视图 滚动当前视图 视图处于滚动状态,点击 NavigationStack 左上角Back按钮。...通过自定义返回按钮以及扩展 UINavigationController 方式,实现了在禁用 Back 按钮后仍支持手势返回,并先修改状态后再进行视图响应。

    34820

    你可能需要为你 APP 适配 iOS11

    前言 前几天发现在做APP在iOS11系统上动画有异常,在其他系统设备上都是正常,动画操作是观察tableViewcontentOffset变化后执行,异常动画发生在tableView reloadData...我用iOS11模拟器体验了一Files这个APP竖屏和横屏,如下图所示: (command+向左箭头让模拟器横屏) 横屏,在iPhone上,tab上图标较小,tab bar较小,这样垂直空间可多放置内容...4、UINavigationController和滚动交互 滚动时候,以下交互操作都是由UINavigationController负责调动: 所以,如果你使用navigation bar,组装push...,使用该类型,如果是右滑操作,一直向右滑动某个cell,会直接执行删除操作,不用再点击删除按钮,这也是一个好玩更新。...滑动操作这里还有一个需要注意是,cell高度较小时,会只显示image,不显示title,cell高度够大,会同时显示image和title。

    2.5K00

    你可能需要为你APP适配iOS11

    前言 前几天发现在做APP在iOS11系统上动画有异常,在其他系统设备上都是正常,动画操作是观察tableViewcontentOffset变化后执行,异常动画发生在tableView reloadData...我用iOS11模拟器体验了一Files这个APP竖屏和横屏,如下图所示: (command+向左箭头让模拟器横屏) 横屏,在iPhone上,tab上图标较小,tab bar较小,这样垂直空间可多放置内容...UINavigationController和滚动交互 滚动时候,以下交互操作都是由UINavigationController负责调动: 所以,如果你使用navigation bar,组装push...,使用该类型,如果是右滑操作,一直向右滑动某个cell,会直接执行删除操作,不用再点击删除按钮,这也是一个好玩更新。...滑动操作这里还有一个需要注意是,cell高度较小时,会只显示image,不显示title,cell高度够大,会同时显示image和title。

    82120

    你可能需要为你 APP 适配 iOS 11

    ,动画操作是观察tableViewcontentOffset变化后执行,异常动画发生在tableView reloadData之后,也就是说tableView reloadData之后,tableView...(command+向左箭头让模拟器横屏) 横屏,在iPhone上,tab上图标较小,tab bar较小,这样垂直空间可多放置内容。...;iOS 11 新增属性 UINavigationController和滚动交互 滚动时候,以下交互操作都是由UINavigationController负责调动: UIsearchController...类型,使用该类型,如果是右滑操作,一直向右滑动某个cell,会直接执行删除操作,不用再点击删除按钮,这也是一个好玩更新。...,cell高度较小时,会只显示image,不显示title,cell高度够大,会同时显示image和title。

    1.7K60

    UI篇-UITabBar及其相关其他知识

    imageView) { return imageView; } } return nil; } 设置TabBar下面的字体在不同状态颜色...弃用.png 系统自带TabBar 中关于底部Bar隐藏问题和返回展现最简单方法: 1....(只要在 push前设定 nextView hidesBottomBarWhenPushed属性才可以有效果,在 push 方法之后设置都不行,init 方法在 push 方法之前执行) if...自定义TbarBar 视图切换动画关键方法(后续会整理出视图切换动画实现) - (id )tabBarController...就是—-使UIView上面的UIButtontitleColor都变成灰色, 而且作用域是整个工程, 也就是说,不管在工程中哪个位置写下这句代码, 整个工程中按钮字体颜色都会变成灰色**

    2K20

    Android开发:Activity 生命周期详解

    " />  程序第一次运行时用户就会看这个Activity,这个Activity可以通过启动其他Activity进行相关操作。...启动其他Activity这个当前这个Activity将会停止,新Activity将会压入栈中,同时获取用户焦点,这时就可在这个Activity上操作了。...都知道栈是先进后出原则,那么当用户Back,当前这个Activity销毁,前一个Activity重新恢复。...image.png 打开Logcat查看输出信息 image.png 我们可以清楚看到,这个Activity创建过程为 create->start->resume Back键和Home键区别 在上述运行状态...,分别点击界面的Back按钮和Home键,再次查看控制台输出 Back键: image.png Home键: image.png 这两者区别显而易见了,点击Back按钮后,此Activity会经历 pause

    48010

    HTML 面试要点:History 和 Hash 路由方式

    # 前端路由实现方法 路由需要实现以下功能: 浏览器地址变化时,切换页面; 点击浏览器【后退】、【前进】按钮,网页内容跟随变化; 刷新浏览器,网页加载当前路由对应内容。...散列值不会随请求发送到服务器端,所以改变 hash,不会重新加载页面 监听 window hashchange 事件,散列值改变,可以通过 location.hash 来获取和设置 hash...值变化,从而触发 onhashchange 事件 浏览器地址栏中 URL 包含 哈希 如 https://cellinlab.xyz/#/home,此时下回车,浏览器发送 https://cellinlab.xyz...,发生改变,只会改变页面的路径,不会刷新页面 History 对象保存了当前窗口访问过所有页面网址,可以通过 history.length 获知当前窗口访问过页面数量 由于安全原因,浏览器不允许脚本读取这些地址...,但允许在地址之间跳转 浏览器工具栏 “前进” 和 “后退” 按钮,其实就是对 History 对象进行操作 # 属性 History 对象主要有两个属性: History.length 当前窗口访问过页面数量

    81920

    # iOS导航栏控制Tips

    2.从显示导航栏页面Push到不显示导航栏页面。 注意: 1.如果导航栏不显示,系统侧滑返回功能无效。...比如,页面用户输入了一些内容后,用户要点击返回,想要回到上一个页面,提醒用户是否要缓存已经输入内容。 如果我们重写了导航栏返回按钮,那么处理这种情况就很Easy,不做赘述了。...但是,如果我们需要在用户点击返回按钮,弹窗提示,那就需要导入这个类别。...,比如我们期望将要push出来控制器再某个栈中控制器后面或者前面,这样点击返回或者侧滑,就直接回到了指定页面了。...或者我们知道将要返回页面的类型,直接pop回指定页面。 扩展出来其他方法都在Demo中了,有兴趣可以看一。 地址是:HLProject

    1.7K31
    领券