本文共 2029 字,大约阅读时间需要 6 分钟。
iOS 扩展 UINavigationController 出栈返回到先前标记的位置
太阳火神的美丽人生 ()
本文遵循“”创作公用协议
这一功能,是突然想到去年看一个 Java 什么数据结构的原码时留下的印象,那里面就是一顿 mark,留标记,。。。都忘了
可是留下了莫名的火花儿,咱也不知道这是哪儿跟哪儿,就联系上了,
不过确实,就是那一瞬间脑袋里浮现了一下下那个 mark,才想起这样做的,无厘头哉?非也!
直接上代码,后附使用说明:
MarkNavigationController.h
#import@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];}
转载地址:http://fthwl.baihongyu.com/