关于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);

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容