類別(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喎?/kf/ware/vc/" target="_blank" class="keylink">vcnlCb2FyZCDA78PmxMfDtLbgv9jWxsb3LM7S0qrSu7j2uPbKtc/WPC9wPg0KPHByZSBjbGFzcz0="brush:java;">
[super viewDidLoad];
[self changeleftItem];
這個方法嗎??
這個問題我暫時還沒想到,先把知道的寫上吧.
1.把剛才的分類頭文件 放到項目的pch文件中
然後,因為是正對UIViewController所寫的分類,
所以我們只要去全局查找
[super viewDidLoad];
然後把它替換成:
[super viewDidLoad];
[self changeleftItem];
**當然,這種簡單粗暴的方法, 還需要注意,我們項目中,是有三個rootViewController的,而這三處,是不能添加箭頭的,因此,我們只需要找到這三處, 刪掉調用分類的方法即可,
目前看來,這是比較快捷的辦法了
PS:個人感覺這樣用分類+替換的方法, 要比單純寫一個父類然後去讓眾多子類繼承要好操作一點,
在已經寫好的VIewController上去修改他們的繼承, 那個工作量還是比較大的~
——end
**