如何實現退出頁面但是不銷毀頁面

項目中可能會遇到類似場景,比如:從二級頁面返回上一級頁面,但是二級頁面還是存在的,如果再次進入二級頁面,還是保留之前的狀態,也就是二級頁面不被銷毀。等真正的關閉二級頁面的時候才銷毀該頁面。
實現原理是,上一級頁面強制引用一下二級頁面的導航控制器,只要這個導航控制不被銷毀,那么二級頁面就不會被銷毀。想要二級頁面銷毀的話,只需要將上級頁面引用的導航控制器置為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
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容