关于backBarButtonItem的N种方法

关于backBarButtonItem的N种方法

今天在做项目的时候遇到一点小问题,后来自己解决了,也顺便思考了一下更深层次的东西,在这里分享一下~~

替换返回按钮的文字

很多app的要求所有的返回按钮的title都是“返回”,如果上一层题目文字太多,下一层的返回按钮文字就会显示不完全,而且这样可以使软件显得整洁。

方法一:

最普通的想法,A界面的navigationItem.backBarButtonItem修改的是B(A的下一级)界面的返回按钮,所以可以写一个BaseViewController,让所有的UIViewController继承它,像这样

- (void)viewDidLoad {

[super viewDidLoad];

self.navigationItem.backBarButtonItem= [[UIBarButtonItem alloc] initWithTitle:@"返回"style:UIBarButtonItemStylePlain target:nil action:nil];

}


方法二:

思路是:在开启程序时,使用Method Swizzling,将系统自带的backBarButtonItem方法替换成我们自定义的方法。

具体实现就是创建个UINavigationItem + BackItem的类别,当系统执行+load方法时,将backBarButtonItem方法和myCustomBackButton方法交换,利用iOS关联方法(objc_getAssociatedObject,objc_setAssociatedObject)在static区创建个backItemButton用来展示。这个方法的好处就是将类别导入到工程里不用任何代码就可以实现,上代码吧:

+(void)load{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

Method originalMethodImp = class_getInstanceMethod(self, @selector(backBarButtonItem));

Method destMethodImp = class_getInstanceMethod(self, @selector(myCustomBackButton));

method_exchangeImplementations(originalMethodImp, destMethodImp);

});

}

static char kCustomBackButtonKey;

-(UIBarButtonItem *)myCustomBackButton{

UIBarButtonItem *item = [self myCustomBackButton];

if (item) {

return item;

}

item = objc_getAssociatedObject(self, &kCustomBackButtonKey);

if (!item) {

item = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:NULL];

objc_setAssociatedObject(self, &kCustomBackButtonKey, item, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

return item;

}

- (void)dealloc

{

objc_removeAssociatedObjects(self);

}

你可能感兴趣的:(关于backBarButtonItem的N种方法)