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

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];
}
时间: 2024-08-27 10:00:42

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

.NET CIL系列第二篇:入栈和出栈——CIL基于栈的本质

在上一篇.NET CIL第一篇:CIL介绍和入门中我们简要介绍了CIL编程的本质,和学习CIL编程的价值.还介绍了CIL的指令.特性和操作码.接下来的文字中会频繁出现:指令.特性.操作码这些关键字.所以请确定你已经知道它们的含义了. 入栈和出栈:CIL基于栈的本质 像C#这样的高级.NET语言,总是试图尽量隐藏底层的实现..NET开发一个不太为人注意的方面就是CIL实际上是一个完全以栈为基础的开发语言.回忆我们熟悉的System.Collections命名空间中的Stack类型的功能,它被用于压

控制器出栈(pop)后,在控制器上创建的线程还在吗?

问题描述 控制器出栈(pop)后,在控制器上创建的线程还在吗? 我现在要实现类似微信发送新鲜事的功能,点了发送之后将这个控制器POP掉. 在后台上传,然后新鲜事直接显示[欺骗用户]. 有没有大神提供一个思路啊? 解决方案 ios开发中控制器的创建出栈到第几个控制器 解决方案二: 不知道啊 路过路过 那几份

【数据结构之旅】顺序栈的定义、初始化、空栈判断、入栈、出栈操作

说明:     往前学习数据结构,想运行一个完整的顺序栈的程序都运行不了,因为书上给的都是一部分一部分的算法,并没有提供一个完整可运行的程序,听了实验课,自己折腾了一下,总算可以写一个比较完整的顺序栈操作的小程序,对于栈也慢慢开始有了感觉.下面我会把整个程序拆开来做说明,只要把这些代码放在一个文件中,用编译器就可以直接编译运行了. 一.实现 1.程序功能   关于栈操作的经典程序,首当要提及进制数转换的问题,利用栈的操作,就可以十分快速地完成数的进制转换. 2.预定义.头文件导入和类型别名   

ios 自动旋转-ios自动旋转出的神奇效果,2个月未解决

问题描述 ios自动旋转出的神奇效果,2个月未解决 1.app有多个页面,但是只允许一个页面旋转,其余不允许旋转的页面添加如下代码: - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return NO; } - (BOOL)shouldAutorotate { return NO; } - (NSUInteger)supportedInterfaceOr

谁能解释下&amp;amp;quot;递归的本质就是用压栈与出栈操作&amp;amp;quot;?

问题描述 谁能解释下"递归的本质就是用压栈与出栈操作"? 递归的本质就是用压栈与出栈操作 这句话感觉很有道理啊 解决方案 当递归调用时每次调用自己时可以看做是压栈过程,当递归条件满足结束时,递归一级一级的返回时可以看做是出栈的过程. 解决方案二: 函数调用的本质就是"压栈与出栈操作",递归不过是它的特例,自身调用自身. 解决方案三: 递归可以简单理解为一个大问题分为小问题,然后小问题继续分解,直到能解决,然后几个小问题解决,就是解决一个大问题,金字塔形状最后解决所有

非递归先序-C++先序遍历非递归算法,可以进栈,不能出栈

问题描述 C++先序遍历非递归算法,可以进栈,不能出栈 #include #include #include"BinaryTree.h" using namespace std; const int stackIncreament = 20; //栈溢出时扩展空间增量 template class SeqStack{ public: int top; SeqStack(int sz=50); //建立一个空栈 ~SeqStack(){delete[] elements;} void p

php array_pop()数组函数将数组最后一个单元弹出(出栈)_php基础

复制代码 代码如下: <?php /*函数array_pop():将数组最后一个单元弹出(出栈) * 1.语法:mixed array_pop ( array &array ) * 2.描述: 弹出并返回 array 数组的最后一个单元,并将数组 array 的长度减一.如果 array 为空(或者不是数组)将返回 NULL. * 3.注意事项: * 3.1. */ echo "****************************************************

php线性表的入栈与出栈实例分析

 本文实例讲述了php线性表的入栈与出栈用法.分享给大家供大家参考.具体如下:   1 2 3 4 5 <?php $stack = array("Simon", "Elaine"); //定义数组 array_push($stack, "Helen", "Peter"); //入栈 print_r($stack); ?>   1 2 3 4 5 <?php $stack = array("Simo

c++-关于C++的入栈和出栈操作

问题描述 关于C++的入栈和出栈操作 使用模板实现一个栈类,实现入栈和出栈操作,分别测试doubleintcharlongbool等类型 解决方案 http://wenku.baidu.com/link?url=FSCYEuOOM_QSZUMRDTi8NV8lyVP0G6pBXPzZ7SbH9ZLskbNUr6dHsX75CPgh1xH2pukZB40OozK9zSNHx4l1sGmesAOa6tAXGlDcLm2d21m 解决方案二: http://zhidao.baidu.com/link?