iOS:優(yōu)雅的攔截返回按鈕

背景:有時(shí)候我們會(huì)遇到需要在用戶點(diǎn)擊返回按鈕pop之前進(jìn)行攔截速种,增加一些業(yè)務(wù)邏輯,如彈出警告彈框詢問用戶是否確實(shí)要返回等配阵。

實(shí)現(xiàn)代碼
  • 1、創(chuàng)建一個(gè)協(xié)議MZCustomProtocol
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@protocol MZCustomProtocol <NSObject>

@optional
/// 點(diǎn)擊返回按鈕的時(shí)候, 需要增加額外操作的時(shí)候, 在當(dāng)前控制器里實(shí)現(xiàn)該方法
- (void)onClickBackButtonWithAdditionalOperating:(UIBarButtonItem *)backItem;

@end

NS_ASSUME_NONNULL_END
  • 2救拉、自定義導(dǎo)航控制器MZBaseNavVC
#import "MZBaseNavVC.h"

#import "MZCustomProtocol.h"

@interface MZBaseNavVC ()<UIGestureRecognizerDelegate>
@end

@implementation MZBaseNavVC

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.interactivePopGestureRecognizer.delegate = self;
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    // 實(shí)現(xiàn)了指定方法的控制器, 就不允許側(cè)滑返回
    if ([self.viewControllers.lastObject respondsToSelector:@selector(onClickBackButtonWithAdditionalOperating:)]) {
        return NO;;
    }
    return self.childViewControllers.count > 1;
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (self.childViewControllers.count > 0) {
        UIButton *back = [UIButton buttonWithType:UIButtonTypeCustom];
        back.frame = CGRectMake(0, 0, 44, 44);
        [back setImage:[UIImage imageNamed:@"back"] forState:UIControlStateNormal];
        [back addTarget:self action:@selector(onClickBackButton:) forControlEvents:UIControlEventTouchUpInside];
        UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithCustomView:back];
        viewController.navigationItem.leftBarButtonItem = backItem;
        self.hidesBottomBarWhenPushed = YES;
    }
    
    [super pushViewController:viewController animated:animated];
}

- (void)onClickBackButton:(id)sender {
    // 實(shí)現(xiàn)了指定方法的控制器, 就走當(dāng)前控制器里實(shí)現(xiàn)的方法
    if ([self.viewControllers.lastObject respondsToSelector:@selector(onClickBackButtonWithAdditionalOperating:)]) {
        [(id<MZCustomProtocol>)self.viewControllers.lastObject onClickBackButtonWithAdditionalOperating:sender];
    } else {
        // If the view controller at the top of the stack is the root view controller, this method does nothing.
        [self.navigationController popViewControllerAnimated:YES];
    }
}

@end
  • 3亿絮、在需要攔截返回按鈕的控制器里,實(shí)現(xiàn)對(duì)應(yīng)的方法 onClickBackButtonWithAdditionalOperating:
#import "DetailViewController.h"

#import "MZCustomProtocol.h"

@interface DetailViewController ()<MZCustomProtocol>
@end

@implementation DetailViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
}

- (void)onClickBackButtonWithAdditionalOperating:(UIBarButtonItem *)backItem {
    UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"溫馨提示" message:@"返回后數(shù)據(jù)將不保存" preferredStyle:UIAlertControllerStyleAlert];
    __weak typeof(self) weakSelf = self;
    [alertVC addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:nil]];
     [alertVC addAction:[UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
         [weakSelf.navigationController popViewControllerAnimated:YES];
    }]];
    [self presentViewController:alertVC animated:YES completion:nil];
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末葱绒,一起剝皮案震驚了整個(gè)濱河市斗锭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岖是,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烈疚,死亡現(xiàn)場(chǎng)離奇詭異聪轿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)陆错,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來对嚼,“玉大人绳慎,你說我怎么就攤上這事纵竖⌒臃撸” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵乏奥,是天一觀的道長亥曹。 經(jīng)常有香客問我,道長媳瞪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任句葵,我火速辦了婚禮,結(jié)果婚禮上乍丈,老公的妹妹穿的比我還像新娘。我一直安慰自己轻专,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布催训。 她就那樣靜靜地躺著宗收,像睡著了一般漫拭。 火紅的嫁衣襯著肌膚如雪混稽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天挑宠,我揣著相機(jī)與錄音颓影,去河邊找鬼懒鉴。 笑死诡挂,一個(gè)胖子當(dāng)著我的面吹牛临谱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悉默,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼抄课,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼唱星!你這毒婦竟也來了跟磨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤哎榴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后尚蝌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衣形,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年热凹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片般妙。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鲜锚,靈堂內(nèi)的尸體忽然破棺而出苫拍,到底是詐尸還是另有隱情芜繁,我是刑警寧澤绒极,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站榔袋,受9級(jí)特大地震影響铡俐,放射性物質(zhì)發(fā)生泄漏凰兑。R本人自食惡果不足惜审丘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锅知。 院中可真熱鬧,春花似錦喉镰、人聲如沸惭笑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柱蟀。三九已至,卻和暖如春长已,著一層夾襖步出監(jiān)牢的瞬間昼牛,已是汗流浹背术瓮。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工胞四, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辜伟。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓脊另,卻偏偏與公主長得像,于是被迫代替她去往敵國和親偎痛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容