你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> [iOS類別的使用]---導航欄leftBarButtonItem圖標修改

[iOS類別的使用]---導航欄leftBarButtonItem圖標修改

編輯:IOS開發綜合

類別(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];

這裡寫圖片描述

這裡寫圖片描述

我們看到, 總共替換了將近74處,如果要自己手動添加,估計要暈菜

**當然,這種簡單粗暴的方法, 還需要注意,我們項目中,是有三個rootViewController的,而這三處,是不能添加箭頭的,因此,我們只需要找到這三處, 刪掉調用分類的方法即可,
目前看來,這是比較快捷的辦法了

PS:個人感覺這樣用分類+替換的方法, 要比單純寫一個父類然後去讓眾多子類繼承要好操作一點,

在已經寫好的VIewController上去修改他們的繼承, 那個工作量還是比較大的~

——end
**

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved