思路:1.替換UINavigationController的pushVC方法。
打印消失頁面導航控制器的所有子控制器(或用其他方法確定消失頁面所在的navivc)。
2.就是下面寫的關於導航控制器setviewControllers一系列方法
繼承於UINavigationController,我們創建一個子類YYYNaviController。
然後其他頁面都使用這個YYYNaviController initRoot。
初級
重新實現下面父類pop方法。有可能有些頁面偷偷的執行了pop
- (UIViewController *)popViewControllerAnimated:(BOOL)animated{
UIViewController *vv = [super popViewControllerAnimated:animated];
return vv;
}
- (NSArray<UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated{
NSArray *vs = [super popToRootViewControllerAnimated:animated];
//nil ?
return vs;
}
- (NSArray<UIViewController *> *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated{
return [super popToViewController:viewController animated:animated];
}
中級
對屬性下手,重寫set get
@property(nonatomic,copy) NSArray<__kindof UIViewController *> *viewControllers; // The current view controller stack.
-(void)setViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers{
[super setViewControllers:viewControllers];
}
- (NSArray<UIViewController *> *)viewControllers{
return [super viewControllers];
}
高級
重寫這個方法
- (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers animated:(BOOL)animated NS_AVAILABLE_IOS(3_0); // If animated is YES, then simulate a push or pop depending on whether the new top view controller was previously in the stack.
檢測方法:重寫方法 & 去掉實現代碼
- (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers animated:(BOOL)animated{
//去掉就不行了
}