iOS讓導(dǎo)航返回按鈕可以選擇性的pop

需求是從不同頁(yè)面push過(guò)來(lái)要做不同的pop怕敬,有的直接返回上一級(jí),有的要返回到rootViewController。

介紹我想到的有兩種方式和遇到的問(wèn)題以及解決的辦法。


方式一:

自定義一個(gè)按鈕狡相,添加點(diǎn)擊事件,在事件中去自由的pop食磕,然后把這個(gè)自定義按鈕設(shè)置為導(dǎo)航欄的self.navigationItem.leftBarButtonItem尽棕。

存在的問(wèn)題:左滑返回的手勢(shì)失效了。

解決辦法:
第一步:在RootViewController的viewDidAppear中把self.navigationController.interactivePopGestureRecognizer.enabled = NO;

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    // 解決自定義返回按鈕影響左滑手勢(shì)的問(wèn)題
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}

第二步:
在push控制器前調(diào)用

    // 解決自定義返回按鈕影響左滑手勢(shì)的問(wèn)題
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)])
    {
        self.navigationController.interactivePopGestureRecognizer.enabled = YES;
        self.navigationController.interactivePopGestureRecognizer.delegate = nil;
    }

方式二:

但是我的項(xiàng)目中用的都是系統(tǒng)的返回按鈕彬伦,如果自定義的話樣式會(huì)不統(tǒng)一滔悉,所以要用系統(tǒng)的返回按鈕。

存在的問(wèn)題:怎么攔截導(dǎo)航欄返回按鈕事件

解決辦法
聲明:此方法網(wǎng)上流傳已久媚朦,我只是搬運(yùn)工氧敢,記錄下來(lái)日戈。具體的作者我也不知道是誰(shuí)询张,向作者致敬。@此方法的第一位分享者
可能是http://stackoverflow.com/questions/1214965/setting-action-for-back-button-in-navigation-controller/19132881#19132881

可以為 UINavigatonController 創(chuàng)建一個(gè) Category浙炼,來(lái)定制navigationBar: shouldPopItem: 的邏輯份氧。這里需要注意的是,我們不需要去設(shè)置 delegate弯屈,因?yàn)?UINavigatonController 自帶的 UINavigationBar 的 delegate 就是導(dǎo)航欄本身蜗帜。這樣還有個(gè)問(wèn)題就是,那在實(shí)際的 Controller 里面怎么控制呢资厉?因此同樣需要對(duì) UIViewController 添加一個(gè) Protocol厅缺,這樣在 Controller 中使用該 Protocol 提供的方法即可進(jìn)行控制了,代碼如下
.h中:

@protocol BackButtonHandlerProtocol <NSObject>
@optional
// 重寫下面的方法以攔截導(dǎo)航欄返回按鈕點(diǎn)擊事件宴偿,返回 YES 則 pop湘捎,NO 則不 pop
-(BOOL)navigationShouldPopOnBackButton;
@end

@interface UIViewController (BackButtonHandler) <BackButtonHandlerProtocol>

@end

.m中

@implementation UIViewController (BackButtonHandler)

@end


@implementation UINavigationController (ShouldPopOnBackButton)

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {
    
    if([self.viewControllers count] < [navigationBar.items count]) {
        return YES;
    }
    
    BOOL shouldPop = YES;
    UIViewController* vc = [self topViewController];
    if([vc respondsToSelector:@selector(navigationShouldPopOnBackButton)]) {
        shouldPop = [vc navigationShouldPopOnBackButton];
    }
    
    if(shouldPop) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self popViewControllerAnimated:YES];
        });
    } else {
        // 取消 pop 后,復(fù)原返回按鈕的狀態(tài)
        for(UIView *subview in [navigationBar subviews]) {
            if(0. < subview.alpha && subview.alpha < 1.) {
                [UIView animateWithDuration:.25 animations:^{
                    subview.alpha = 1.;
                }];
            }
        }
    }
    return NO;
}

@end

調(diào)用:
在需要定制的ViewController中導(dǎo)入分類

#import "UIViewController+BackButtonHandler.h"

重寫navigationShouldPopOnBackButton方法:

- (void)navigationShouldPopOnBackButton {
    // 定制具體的pop方式
    if ([self.inputParameter[@"isAgreementPage"] boolValue]) {
        [self.navigationController popToRootViewControllerAnimated:YES];
    } else {
        [self.navigationController popViewControllerAnimated:YES];
    }
}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窄刘,一起剝皮案震驚了整個(gè)濱河市窥妇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌娩践,老刑警劉巖活翩,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烹骨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡材泄,警方通過(guò)查閱死者的電腦和手機(jī)沮焕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拉宗,“玉大人遇汞,你說(shuō)我怎么就攤上這事〔痉希” “怎么了空入?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)族檬。 經(jīng)常有香客問(wèn)我歪赢,道長(zhǎng),這世上最難降的妖魔是什么单料? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任埋凯,我火速辦了婚禮,結(jié)果婚禮上扫尖,老公的妹妹穿的比我還像新娘白对。我一直安慰自己,他們只是感情好换怖,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布甩恼。 她就那樣靜靜地躺著,像睡著了一般沉颂。 火紅的嫁衣襯著肌膚如雪条摸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天铸屉,我揣著相機(jī)與錄音钉蒲,去河邊找鬼。 笑死彻坛,一個(gè)胖子當(dāng)著我的面吹牛顷啼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昌屉,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼钙蒙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了怠益?” 一聲冷哼從身側(cè)響起仪搔,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜻牢,沒(méi)想到半個(gè)月后烤咧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偏陪,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年煮嫌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笛谦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昌阿,死狀恐怖饥脑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情懦冰,我是刑警寧澤灶轰,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站刷钢,受9級(jí)特大地震影響笋颤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜内地,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一伴澄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧阱缓,春花似錦非凌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至祭犯,卻和暖如春秸妥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沃粗。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留键畴,地道東北人最盅。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像起惕,于是被迫代替她去往敵國(guó)和親涡贱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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