這一功能,是突然想到去年看一個 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]; }