Method Swizzling 的一個使用場景

很早就看過一些關(guān)于 Method Swizzling 的博客仔涩,看完后一直沒有一個恰當(dāng)?shù)氖褂脠鼍澳懿倬氁幌滤魃汀W罱鼘懸粋€ Demo 的時候發(fā)現(xiàn)要在很多控制器里寫導(dǎo)航欄的返回按鈕,本來是復(fù)制一下或者繼承一下就行的篇梭。但是復(fù)制這種做法挺蠢的蔼两,繼承會讓代碼耦合性增加。這個時候我就突然的想到了 Method Swizzling赔桌,然后做了一個嘗試供炎。

創(chuàng)建一個 UIViewController 的分類,引入#import <objc/runtime.h>頭文件疾党∫艚耄基本代碼如下:

@implementation UIViewController (BackButton)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];
    
        SEL originalSelector = @selector(viewWillAppear:);
        SEL swizzledSelector = @selector(swizzled_viewWillAppear:);
    
        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
    
        BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
    
        if (didAddMethod) {
            class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

#pragma mark - Method Swizzling
- (void)swizzled_viewWillAppear:(BOOL)animated {
    [self swizzled_viewWillAppear:animated];
    
    //在這里判斷哪個控制器不需要返回按鈕
    if (![self isMemberOfClass:NSClassFromString(@"ViewController")]) {
        UIImage *image = [UIImage imageNamed:@"goBack_blue.png"];
        UIButton *leftButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, image.size.width, image.size.height)];
        [leftButton setImage:image forState:UIControlStateNormal];
        [leftButton addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchUpInside];
        UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:leftButton];
        self.navigationItem.leftBarButtonItem = leftBarButtonItem;
    }

    NSLog(@"swizzled_viewWillAppear");
}

- (void)goBack {
    [self.navigationController popViewControllerAnimated:YES];
}

@end

這樣就實現(xiàn)了,下篇見~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雪位,一起剝皮案震驚了整個濱河市竭钝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌雹洗,老刑警劉巖香罐,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異队伟,居然都是意外死亡穴吹,警方通過查閱死者的電腦和手機(jī)幽勒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門嗜侮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事锈颗∏昱” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵击吱,是天一觀的道長淋淀。 經(jīng)常有香客問我,道長覆醇,這世上最難降的妖魔是什么朵纷? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮永脓,結(jié)果婚禮上袍辞,老公的妹妹穿的比我還像新娘。我一直安慰自己常摧,他們只是感情好搅吁,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著落午,像睡著了一般谎懦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上溃斋,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天界拦,我揣著相機(jī)與錄音,去河邊找鬼梗劫。 笑死寞奸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的在跳。 我是一名探鬼主播枪萄,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼猫妙!你這毒婦竟也來了瓷翻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤割坠,失蹤者是張志新(化名)和其女友劉穎齐帚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彼哼,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡对妄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了敢朱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剪菱。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡摩瞎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孝常,到底是詐尸還是另有隱情旗们,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布构灸,位于F島的核電站上渴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏喜颁。R本人自食惡果不足惜稠氮,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望半开。 院中可真熱鬧括袒,春花似錦、人聲如沸稿茉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漓库。三九已至恃慧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間渺蒿,已是汗流浹背痢士。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留茂装,地道東北人怠蹂。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像少态,于是被迫代替她去往敵國和親城侧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉彼妻,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,721評論 0 9
  • 文中的實驗代碼我放在了這個項目中嫌佑。 以下內(nèi)容是我通過整理[這篇博客] (http://yulingtianxia....
    茗涙閱讀 923評論 0 6
  • 轉(zhuǎn)載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 735評論 0 2
  • 本文轉(zhuǎn)自:楊蕭玉博客 本文詳細(xì)整理了 Cocoa 的 Runtime 系統(tǒng)的知識,它使得 Objective-C ...
    oneofai閱讀 208評論 0 0
  • 繼上篇安裝使用教程侨歉,在這里寫一下可能會遇到的問題:這個也是最坑的地方屋摇,有些我有遇到,有些沒有幽邓,在這里整理了下炮温,心累...
    你的小福蝶閱讀 774評論 0 1