[iOS類別的使用]---導覽列leftBarButtonItem表徵圖修改
類別(Category) 修改特定的ViewController的導覽列Item表徵圖
在項目中,遇到這樣一個問題:
一個新增的VIewController1 想要push到原有的別的VIewController2中時
原有的VIewController2的導覽列左側leftBarButtonItem表徵圖,變成了系統內建的樣式,
而且,由於項目混合使用了代碼和StoryBoard開發,更增加了統一修改leftBarButtonItem的難度!
一般來說,我們會在 VIewController2 中 重新定義一個UIBarButtomItem ,插入如下代碼進行局部修改
代碼如下
-(void)changeleftItem{ UIImageView *imagview = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 32, 32)]; imagview.image = [UIImage imageNamed:@"jiantou"]; UIBarButtonItem *left = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"jiantou"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStyleDone target:self action:@selector(back)]; self.navigationItem.leftBarButtonItem = left;}-(void)back{ [self.navigationController popViewControllerAnimated:YES];}
如此代碼修改好後:
但是問題來了
如果 我只是修改一個部分, 那麼代碼量還是可以接受的,
而我所希望的是VIewController2 push到的下一個頁面 也是如此
又或則VIewController1 push到 VIewController3頁面, 箭頭表徵圖也要保持一直,難道我要寫很多遍?
我又不想寫一個UIViewController的子類 來作為這些類的父類用以繼承,該怎麼辦??
這時候,
想起來類別(分類 Category)可以擴充類的方法和功能,
( 類別(Category)是一種可以為現有的類(包括類簇:NSString…,甚至源碼無法獲得的類)添加新方法的方式無需從現有的類繼承子類。類別添加的新方法可以被子類繼承。)
這個好,那麼就為UIViewcontroller寫一個分類吧
//.h#import @interface UIViewController (changeLeftItem)-(void)changeleftItem;@end//.m-(void)changeleftItem{ UIImageView *imagview = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 32, 32)]; imagview.image = [UIImage imageNamed:@"jiantou"]; UIBarButtonItem *left = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"jiantou"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStyleDone target:self action:@selector(back)]; self.navigationItem.leftBarButtonItem = left;}-(void)back{ [self.navigationController popViewControllerAnimated:YES];}
//然後,去控制器裡面 ,添加標頭檔名,(或則去pch檔案添加)
然後去時間分類.h裡面的方法吧, 效果就出來了!!
**這也只是少了一半的代碼量而已,如果我要全部修改成現有箭頭的樣式呢? StZ喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcnlCb2FyZCDA78PmxMfDtLbgv9jWxsb3LM7S0qrSu7j2uPbKtc/WPC9wPg0KPHByZSBjbGFzcz0="brush:java;"> [super viewDidLoad];[self changeleftItem];
這個方法嗎??
這個問題我暫時還沒想到,先把知道的寫上吧.
好吧,我粗暴的解決了剛才的問題
1.把剛才的分類標頭檔 放到項目的pch檔案中
然後,因為是正對UIViewController所寫的分類,
所以我們只要去全域尋找
[super viewDidLoad];
然後把它替換成:
[super viewDidLoad]; [self changeleftItem];
我們看到, 總共替換了將近74處,如果要自己手動添加,估計要暈菜
**當然,這種簡單粗暴的方法, 還需要注意,我們項目中,是有三個rootViewController的,而這三處,是不能添加箭頭的,因此,我們只需要找到這三處, 刪掉調用分類的方法即可,
目前看來,這是比較快捷的辦法了
PS:個人感覺這樣用分類+替換的方法, 要比單純寫一個父類然後去讓眾多子類繼承要好操作一點,
在已經寫好的VIewController上去修改他們的繼承, 那個工作量還是比較大的~
——end
**