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