美文网首页
关于backBarButtonItem的N种方法

关于backBarButtonItem的N种方法

作者: VincentHK | 来源:发表于2017-11-14 14:49 被阅读0次

    关于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种方法

          本文链接:https://www.haomeiwen.com/subject/geqfvxtx.html