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]; }