iOS 扩展 UINavigationController 出栈返回到先前标记的位置

简介: iOS 扩展 UINavigationController 出栈返回到先前标记的位置太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)本文遵循“署名-非商业用途-保持一致”创作公用协议转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

iOS 扩展 UINavigationController 出栈返回到先前标记的位置

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino否则,出自本博客的文章拒绝转载或再转载,谢谢合作。



这一功能,是突然想到去年看一个 Java 什么数据结构的原码时留下的印象,那里面就是一顿 mark,留标记,。。。都忘了

可是留下了莫名的火花儿,咱也不知道这是哪儿跟哪儿,就联系上了,

不过确实,就是那一瞬间脑袋里浮现了一下下那个 mark,才想起这样做的,无厘头哉?非也!

直接上代码,后附使用说明:


MarkNavigationController.h

#import <UIKit/UIKit.h>

@interface MarkNavigationController : UINavigationController

@property (nonatomic, strong) NSMutableArray *markControllers;
@property (nonatomic, weak) UIViewController *lastMarkController;

- (void)popToMarkViewControllerAnimated:(BOOL)animated;
- (void)mark;

@end


MarkNavigationController.m

#import "MarkNavigationController.h"

@interface MarkNavigationController ()

@end

@implementation MarkNavigationController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.markControllers = [[NSMutableArray alloc] init];
}


#pragma mark - 

- (void)popToMarkViewControllerAnimated:(BOOL)animated {
    
    if (self.markControllers.count > 0) {
        
        [self.markControllers removeObject:self.lastMarkController];
        [self popToViewController:self.lastMarkController animated:YES];
        
        if (self.markControllers.count > 0) {
            
            self.lastMarkController = self.markControllers.lastObject;
        }
        else {
            
            self.lastMarkController = nil;
        }        
    }
}

// 必须与上一方法匹配使用,避勉内存泄漏
- (void)mark {
    
    self.lastMarkController = self.viewControllers.lastObject;
    [self.markControllers removeObject:self.lastMarkController];
    [self.markControllers addObject:self.lastMarkController];
}

@end

在 push 前,先调用 mark,将当前视图控制器标记为最后一个出栈返回点,

之后无论 push 多少视图控制器到栈中,调用 - (void)popToMarkViewControllerAnimated:(BOOL)animated; 时,会自动出栈视图控制器直到最后标记的控制器。

实际上就是给导航控制器加了一个存储而已。


压栈前标记:

#pragma mark - NavigationBarButtonDelegate

- (void)leftBarButtonPressed:(id)sender {
    
    NSLog(@"leftBarButtonPressed");
    
    [self mark];
    [self performSegueWithIdentifier:@"SegueToGetClassCode" sender:sender];
}

出栈返回到最后标记位置:

#pragma mark -

- (IBAction)popToMarkButtonPressed:(id)sender {
    
    [self popToMarkViewControllerAnimated:YES];
}





目录
相关文章
|
4月前
|
监控 iOS开发 开发者
iOS性能优化:深入函数调用栈与符号化技术
在iOS开发中,函数调用栈是理解程序执行流程和优化性能的关键。当应用出现性能问题或崩溃时,能够准确地读取和解析调用栈信息对于快速定位问题至关重要。本文将探讨iOS中的函数调用栈,以及如何通过符号化技术进行有效的性能调优。
61 3
|
4月前
|
监控 算法 iOS开发
深入探索iOS函数调用栈:符号化与性能调优实战
在iOS开发中,理解函数调用栈对于性能调优和问题排查至关重要。函数调用栈记录了程序执行过程中的函数调用顺序,通过分析调用栈,我们可以识别性能瓶颈和潜在的代码问题。本文将分享iOS函数调用栈的基本概念、符号化过程以及如何利用调用栈进行性能调优。
59 2
|
JavaScript Android开发 iOS开发
兼容安卓和ios的手机端浏览器返回和物理返回的监听处理操作实战(推荐)
兼容安卓和ios的手机端浏览器返回和物理返回的监听处理操作实战(推荐)
364 0
兼容安卓和ios的手机端浏览器返回和物理返回的监听处理操作实战(推荐)
|
iOS开发
iOS分享扩展支持自定义联系人
iOS可以通过添加Share Extension来扩展系统的分享组件,能够支持将网页,图片,音乐或任何接入了系统分享组件功能的应用分享到我们自己的App内。
378 0
|
搜索推荐 iOS开发
iOS小技能:消息推送扩展的使用
iOS小技能:消息推送扩展的使用
584 0
iOS小技能:消息推送扩展的使用
|
网络协议 Unix API
iOS进程间的实时通讯方案: local socket(解决扩展和容器应用的实时通讯问题)
iOS进程间的实时通讯方案: local socket(解决扩展和容器应用的实时通讯问题)
425 0
iOS进程间的实时通讯方案: local socket(解决扩展和容器应用的实时通讯问题)
|
JSON API 数据格式
iOS保存接口返回枚举数据为本地json文件可用于测试
iOS保存接口返回枚举数据为本地json文件可用于测试
362 0
iOS保存接口返回枚举数据为本地json文件可用于测试
|
XML JSON JavaScript
iOS网络请求指南: 请求参数的拼接(签名)、返回参数解析(JSON/XML解析)、案例(条码支付综合前置平台申请退款)
iOS网络请求指南: 请求参数的拼接(签名)、返回参数解析(JSON/XML解析)、案例(条码支付综合前置平台申请退款)
441 0
iOS网络请求指南: 请求参数的拼接(签名)、返回参数解析(JSON/XML解析)、案例(条码支付综合前置平台申请退款)
|
iOS开发
iOS 屏幕边缘侧滑返回
iOS 屏幕边缘侧滑返回
530 0

热门文章

最新文章

  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 2
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 3
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 5
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 6
    iOS各个证书生成细节
  • 7
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
  • 8
    iOS开发-UIScrollView原理
  • 9
    iOS - Swift NSPoint 位置
  • 10
    iOS:应用程序的线程安全性