ios11中如何使用两种方法替换method swizzling去掉导航栏返回按钮的文字

科技资讯 投稿 8500 0 评论

ios11中如何使用两种方法替换method swizzling去掉导航栏返回按钮的文字

本章内容给大家谈谈关于遇上ios11中如何使用两种方法替换method swizzling去掉导航栏返回按钮的文字等问题,我们该怎么处理呢。下面这篇文章将为你提供一个解决思路,希望能帮你解决到相关问题。

什么是Method Swizzling

在Objective-C中,方法拦截或者说Method Swizzling 实际上是在运行时通过改变方法选择器(Method Selector)和方法实现(Method Implementation)之间的对应关系来动态的修改一个类的行为。我们可以通过Method Swizzling处理一些系统库中非完美或者不能完全控制的方法和流程。这是一个强大的技术,但也需要我们谨慎使用。

使用Method Swizzling去掉导航栏返回按钮的文字的方法

在iOS中,默认的导航栏返回按钮会自动显示返回上一页的标题文字。但是我们可以通过Method Swizzling的技术将这个文字去掉,有两种方法可以实现:

方法一:自定义返回按钮

通过替换导航栏的返回按钮视图,来达到去掉返回按钮文字的效果。这个方法需要我们自定义一个UIBarButtonItem并添加到导航栏左侧。下面是实现代码:


- (void)viewDidLoad {
    [super viewDidLoad];
    UIImage *backButtonImage = [[UIImage imageNamed:@"backButton"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(-60, -60) forBarMetrics:UIBarMetricsDefault];
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:nil action:nil];
}

上述代码实现了自定义导航栏返回按钮的功能,并去掉了返回文字。通过设置UIBarButtonItem的背景图片,我们可以设置自定义的返回按钮视图;通过调整偏移量,我们可以去掉按钮上原有的返回文字。最后,通过创建一个空标题的UIBarButtonItem,来实现去掉返回按钮文字的效果。

方法二:替换UIBarItem的setTitle:

使用Method Swizzling,通过替换系统UIBarItem的setTitle:方法,来达到去掉返回按钮文字的效果。下面是实现代码:


@implementation UIBarButtonItem (CustomizeBackButtonTitle)
+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSString *className = @"UIBarButtonItemButton";
        Class cls = NSClassFromString(className);
        SEL originalSelector = @selector(setTitle:);
        SEL swizzledSelector = @selector(customize_setTitle:);
        Method originalMethod = class_getInstanceMethod(cls, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(self, swizzledSelector);
        method_exchangeImplementations(originalMethod, swizzledMethod);
    });
}
- (void)customize_setTitle:(NSString *)title {
    if ([self.title isEqualToString:@"返回"]) {
        [self customize_setTitle:@""];
    } else {
        [self customize_setTitle:title];
    }
}
@end

上述代码中,我们通过使用dispatch_once函数保证在运行时只调用一次。然后获取到UIBarButtonItemButton类,获取到查询方法的selector。通过method_exchangeImplementations函数,交换了自定义方法和原始方法的实现。最后,在自定义方法中,判断当前按钮的标题是否为默认返回文字“返回”,如果是则设置为空字符;如果不是,则调用原来的方法设置标题。

以上两种方法均可以实现去掉导航栏返回按钮文字的效果,但是方法一相对而言更加稳定和灵活。如果您需要在导航栏功能的基础上快速实现去掉文字需求,可以使用方法一,它有着更好的可控性。如果您对Method Swizzing有着深入的掌握,可以使用方法二更加灵活和精确地实现您的需求。

总结

以上就是为你整理的ios11中如何使用两种方法替换method swizzling去掉导航栏返回按钮的文字全部内容,希望文章能够帮你解决相关问题,更多请关注本站相关栏目的其它相关文章!

编程笔记 » ios11中如何使用两种方法替换method swizzling去掉导航栏返回按钮的文字

赞同 (40) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽