項目中可能會遇到類似場景,比如:從二級頁面返回上一級頁面,但是二級頁面還是存在的,如果再次進入二級頁面,還是保留之前的狀態,也就是二級頁面不被銷毀。等真正的關閉二級頁面的時候才銷毀該頁面。
實現原理是,上一級頁面強制引用一下二級頁面的導航控制器,只要這個導航控制不被銷毀,那么二級頁面就不會被銷毀。想要二級頁面銷毀的話,只需要將上級頁面引用的導航控制器置為nil即可,注:跳轉使用modal,不用push
AViewController為一級頁面,BViewController為二級頁面
1、從A跳轉到B,然后從B退出到A時保留B
2、在保留B的情況下,再次進入B還是之前的頁面狀態
3、在B中進行關閉操作,直接銷毀自己,退出
4、在保留B的情況下,在A中直接銷毀B
代碼如下:
#import "AViewController.h"
@interface AViewController ()
//強制引用nav
@property (nonatomic,strong) UINavigationController *nav;
@end
@implementation AViewController
- (void)viewDidLoad {
[super viewDidLoad];
//定義UI,需要兩個按鈕,來實現下面的兩個點擊方法,一個是跳轉BViewController頁面的方法,一個是關閉BViewController的方法
//添加按鈕代碼。。。。。
//接收二級頁面內部點擊關閉頁面的通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fetchNoti:) name:@"closeBController" object:nil];
}
//接收通知
- (void)fetchNoti:(NSNotification *)noti{
//二級頁面內部點擊關閉頁面,則要通知到外部一級頁面,進行將導航控制器置為nil,二級頁面才會被銷毀
if (self.nav) {
self.nav = nil;
}
}
//跳轉到BViewController方法
- (void)jumpToBViewController{
if (self.nav) {
//如果導航控制器存在,說明之前跳轉過,二級頁面還沒有銷毀,直接跳轉即可
[self presentViewController:self.nav animated:YES completion:^{
NSLog(@"已經跳轉");
}];
return;
}
//如果導航控制器不存在,說明首次跳轉或者二級頁面已經被銷毀,則重新初始化后跳轉
SJTestViewController *vc = [[SJTestViewController alloc] init];
self.nav = [[UINavigationController alloc] initWithRootViewController:vc];
self.nav.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:self.nav animated:YES completion:^{
NSLog(@"已經跳轉");
}];
}
//如果從二級頁面返回后沒有被銷毀,想在一級頁面有個按鈕銷毀二級頁面
- (void)onAPageCloseBViewController{
if(self.nav){
self.nav = nil;
}
}
@implementation BViewController ()
- (void)viewDidLoad {
// UI代碼編寫,兩個按鈕,一個退出操作(頁面不銷毀),一個關閉操作(頁面銷毀)
}
//退出操作(頁面不銷毀)
- (void)quitAction:(UIButton *)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}
//關閉操作(頁面銷毀,原理就是給外部通知了)
- (void)closeAction:(UIButton *)sender {
[[NSNotificationCenter defaultCenter] postNotificationName:@"closeBController" object:nil];
[self dismissViewControllerAnimated:YES completion:nil];
}
//用來測試頁面是否被釋放了
- (void)dealloc{
NSLog(@"徹底釋放");
}
@end