iOS 扩展 UINavigationController 出栈返回到先前标记的位置
太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)
本文遵循“署名-非商业用途-保持一致”创作公用协议
这一功能,是突然想到去年看一个 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];
}