UINavigationController 給pop增加回調(diào)方法

一衷掷、應(yīng)用場(chǎng)景

我們需求是push之后一個(gè)界面,再pop回來(lái),需要檢測(cè)一下柿菩,如果不符合戚嗅,就再Pop回去。(其實(shí)這樣的動(dòng)畫(huà)也不是太好。)

二懦胞、正常的敲代碼

A push B push C

 [self.navigationController popViewControllerAnimated:YES]; // C回來(lái)

 if (YES) { // 某種檢測(cè)邏輯(聯(lián)網(wǎng)檢測(cè)) B頁(yè)面
   [self.navigationController popViewControllerAnimated:YES]; // 連續(xù)pop
 }

這時(shí)候我們驚人的發(fā)現(xiàn)替久,iOS7的機(jī)子crash。這時(shí)候內(nèi)心是抓狂的躏尉。頓時(shí)覺(jué)得蚯根,這什么破需求碰上了系統(tǒng)沒(méi)有優(yōu)化的bug(iOS8以上(含)系統(tǒng)已自動(dòng)修復(fù))。

這時(shí)候我們解決辦法就是等上一個(gè)pop結(jié)束胀糜。再檢測(cè)pop颅拦。上一個(gè)pop結(jié)束的時(shí)機(jī)就是B頁(yè)面viewDidAppear和C頁(yè)面的viewDidDisappear

三、黑魔法給pop添加完成回調(diào)

UIViewController交換方法實(shí)現(xiàn)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        [self swizzleOriginMethod:@selector(viewDidDisappear:) anotherSelecor:@selector(xks_viewDidDisappear:)];
    });
}
- (void)xks_viewDidDisappear:(BOOL)animated {
    [super xks_viewDidDisappear:animated];

    void(^popCompeletion)() = objc_getAssociatedObject(self, @"popCompeletion");
    if (popCompeletion) {
        popCompeletion();
    }
}

UINavigationController給增加分類(lèi),pop回調(diào)

- (void)popViewControllerAnimated:(BOOL)animated compeletion:(void(^)())compeletion {
   UIViewController *topVC = self.topViewController;

    __weak typeof(topVC) weakTopVC = topVC;
    void(^popCompeletion)() = ^{
        __strong typeof(weakTopVC) topVC = weakTopVC;
        BOOL directPop = [objc_getAssociatedObject(topVC, @"directPop") boolValue];
        if (!directPop) { // 預(yù)防compeletion被多次執(zhí)行
            objc_setAssociatedObject(topVC, @"directPop", @(YES), OBJC_ASSOCIATION_ASSIGN);
            
            if (compeletion) {
                compeletion();
            }
        }
    };
    objc_setAssociatedObject(topVC, @"popCompeletion", popCompeletion, OBJC_ASSOCIATION_COPY_NONATOMIC);
    
    [self popViewControllerAnimated:animated];
}

四教藻、優(yōu)雅的使用

給目標(biāo)C植入block

__weak typeof(self) weakSelf = self;
cVC.compeletion = ^{
   __strong typeof(weakSelf) self = weakSelf;
   // C回來(lái)之后距帅,再pop
   [self.navigationController popViewControllerAnimated:YES compeletion:{
      if (YES) { // 某種檢測(cè)邏輯(聯(lián)網(wǎng)檢測(cè)) B頁(yè)面
         [self.navigationController popViewControllerAnimated:YES]; // 連續(xù)pop,pop到A
      }
   }];
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市括堤,隨后出現(xiàn)的幾起案子碌秸,更是在濱河造成了極大的恐慌,老刑警劉巖悄窃,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讥电,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡广匙,警方通過(guò)查閱死者的電腦和手機(jī)允趟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鸦致,“玉大人潮剪,你說(shuō)我怎么就攤上這事》滞伲” “怎么了抗碰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)绽乔。 經(jīng)常有香客問(wèn)我弧蝇,道長(zhǎng),這世上最難降的妖魔是什么折砸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任看疗,我火速辦了婚禮,結(jié)果婚禮上睦授,老公的妹妹穿的比我還像新娘两芳。我一直安慰自己,他們只是感情好去枷,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布怖辆。 她就那樣靜靜地躺著是复,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竖螃。 梳的紋絲不亂的頭發(fā)上淑廊,一...
    開(kāi)封第一講書(shū)人閱讀 52,785評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音特咆,去河邊找鬼季惩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腻格,可吹牛的內(nèi)容都是我干的蜀备。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼荒叶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了输虱?” 一聲冷哼從身側(cè)響起些楣,我...
    開(kāi)封第一講書(shū)人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宪睹,沒(méi)想到半個(gè)月后愁茁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亭病,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年鹅很,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罪帖。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡促煮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出整袁,到底是詐尸還是另有隱情菠齿,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布坐昙,位于F島的核電站绳匀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏炸客。R本人自食惡果不足惜疾棵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痹仙。 院中可真熱鬧是尔,春花似錦、人聲如沸蝶溶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至梨州,卻和暖如春痕囱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背暴匠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工鞍恢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人每窖。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓帮掉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親窒典。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蟆炊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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

  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,168評(píng)論 30 470
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件瀑志、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,124評(píng)論 4 61
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中涩搓。。劈猪。 其實(shí)如果沒(méi)有APIManager這一層是沒(méi)法使用delegate的昧甘,畢竟多個(gè)單...
    yhtang閱讀 5,208評(píng)論 1 23
  • 172.簡(jiǎn)述視圖控制器的生命周期。 1)init函數(shù)(init;initWithFrame;initWithCod...
    AlanGe閱讀 377評(píng)論 0 0
  • 領(lǐng)域特殊性和回路錯(cuò)誤的關(guān)系是面和點(diǎn)的關(guān)系战得,它們都是在我們的認(rèn)知系統(tǒng)中已經(jīng)形成的本能認(rèn)知回路充边,這里對(duì)“回路”形成的過(guò)...
    崩豆老師閱讀 483評(píng)論 0 1