使用runtime机制隐藏IOS工程中所有的导航栏返回按钮标题

今天药忘吃喽~ 2022-06-08 14:19 247阅读 0赞

1.为工程添加UIViewController的一个分类BackItem

因为这个文件会被添加到Build Phases->Compile Sources中,所以会在工程的编译的时候就编译,写的代码也就会在整个工程中有效果,不需要在每个都.m文件中引入这个分类。

2.添加一个viewDidLoadBackItem实例方法,并在方法中隐去导航栏返回按钮的标题。

  1. self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]
  2. initWithTitle:@""
  3. style:UIBarButtonItemStylePlain
  4. target:self
  5. action:nil];

3.重写load方法

因为load方法不像类的其他方法那样遵从继承规则,当每个类没有实现 load方法,不管各级超类是否实现,系统都不会调用此类的load方法。并且基于load方法调用机制

(1)load方法调用的顺序:父类(Superclass)的方法优先于子类(Subclass)的方法,类中的方法优先于类别(Category)中的方法。

(2)所有类别(Category)中的load方法都会执行。

在load方法中去进行方法实现的交换。

  1. //使用runtime交换原来的viewDidLoad对象方法
  2. Method viewDidloadMethod=class_getInstanceMethod([self class], @selector(viewDidLoad));
  3. //使用runtime交换新加的viewDidLoadBackItem对象方法
  4. Method viewDidloadMethodHideBackItem=class_getInstanceMethod([self class], @selector(viewDidLoadBackItem));
  5. //交换两个方法的实现
  6. method_exchangeImplementations(viewDidloadMethod, viewDidloadMethodHideBackItem);

4.最终的代码

  1. #import "UIViewController+BackItem.h"
  2. #import <objc/runtime.h>
  3. @implementation UIViewController (BackItem)
  4. +(void)load{
  5. //使用runtime交换原来的viewDidLoad对象方法
  6. Method viewDidloadMethod=class_getInstanceMethod([self class], @selector(viewDidLoad));
  7. //使用runtime交换新加的viewDidLoadBackItem对象方法
  8. Method viewDidloadMethodHideBackItem=class_getInstanceMethod([self class], @selector(viewDidLoadBackItem));
  9. //交换两个方法的实现
  10. method_exchangeImplementations(viewDidloadMethod, viewDidloadMethodHideBackItem);
  11. }
  12. //因为交换了原来的viewDidLoad和新添加的viewDidLoadBackItem方法的实现 所以在工程里调用viewDidLoad方法的地方都会被替换成viewDidLoadBackItem的实现
  13. - (void)viewDidLoadBackItem
  14. {
  15. //因为已经交换了原来的viewDidLoad和新添加的viewDidLoadBackItem方法的实现 现在调用viewDidLoadBackItem就是调用原来的viewDidLoad
  16. [self viewDidLoadBackItem];
  17. self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]
  18. initWithTitle:@""
  19. style:UIBarButtonItemStylePlain
  20. target:self
  21. action:nil];
  22. }
  23. @end

5.使用方法:

直接把头文件和.m文件添加到工程就可以实现把导航栏返回按钮的标题隐藏的功能了。

分类源文件下载链接

发表评论

表情:
评论列表 (有 0 条评论,247人围观)

还没有评论,来说两句吧...

相关阅读