使用runtime机制隐藏IOS工程中所有的导航栏返回按钮标题
1.为工程添加UIViewController的一个分类BackItem
因为这个文件会被添加到Build Phases->Compile Sources中,所以会在工程的编译的时候就编译,写的代码也就会在整个工程中有效果,不需要在每个都.m文件中引入这个分类。
2.添加一个viewDidLoadBackItem实例方法,并在方法中隐去导航栏返回按钮的标题。
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]
initWithTitle:@""
style:UIBarButtonItemStylePlain
target:self
action:nil];
3.重写load方法
因为load方法不像类的其他方法那样遵从继承规则,当每个类没有实现 load方法,不管各级超类是否实现,系统都不会调用此类的load方法。并且基于load方法调用机制
(1)load方法调用的顺序:父类(Superclass)的方法优先于子类(Subclass)的方法,类中的方法优先于类别(Category)中的方法。
(2)所有类别(Category)中的load方法都会执行。
在load方法中去进行方法实现的交换。
//使用runtime交换原来的viewDidLoad对象方法
Method viewDidloadMethod=class_getInstanceMethod([self class], @selector(viewDidLoad));
//使用runtime交换新加的viewDidLoadBackItem对象方法
Method viewDidloadMethodHideBackItem=class_getInstanceMethod([self class], @selector(viewDidLoadBackItem));
//交换两个方法的实现
method_exchangeImplementations(viewDidloadMethod, viewDidloadMethodHideBackItem);
4.最终的代码
#import "UIViewController+BackItem.h"
#import <objc/runtime.h>
@implementation UIViewController (BackItem)
+(void)load{
//使用runtime交换原来的viewDidLoad对象方法
Method viewDidloadMethod=class_getInstanceMethod([self class], @selector(viewDidLoad));
//使用runtime交换新加的viewDidLoadBackItem对象方法
Method viewDidloadMethodHideBackItem=class_getInstanceMethod([self class], @selector(viewDidLoadBackItem));
//交换两个方法的实现
method_exchangeImplementations(viewDidloadMethod, viewDidloadMethodHideBackItem);
}
//因为交换了原来的viewDidLoad和新添加的viewDidLoadBackItem方法的实现 所以在工程里调用viewDidLoad方法的地方都会被替换成viewDidLoadBackItem的实现
- (void)viewDidLoadBackItem
{
//因为已经交换了原来的viewDidLoad和新添加的viewDidLoadBackItem方法的实现 现在调用viewDidLoadBackItem就是调用原来的viewDidLoad
[self viewDidLoadBackItem];
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]
initWithTitle:@""
style:UIBarButtonItemStylePlain
target:self
action:nil];
}
@end
5.使用方法:
直接把头文件和.m文件添加到工程就可以实现把导航栏返回按钮的标题隐藏的功能了。
分类源文件下载链接
还没有评论,来说两句吧...