iOS 全局修改UINavigation 后退按钮

快两年没有更新blog了,现在有点时间随便写点东西吧。

做iOS项目中,可能会经常遇到要定制后退按钮的情况,比如把后退按钮的title固定为“返回”(修改title对后面push的vc生效),比如用图片,这时候大家一般会选择添加一个vc的基类,因为这个问题其实很简单,随便做点什么都能解决,今天我用另一种优雅的方法来解决这个问题。

默认iOS7的后退按钮是一个箭头+文字,如果想只要箭头的话,只要把title设为空就行了,我先用普通的类别方式来做,首先添加类别:

@implementation UINavigationItem (CustomBackButton)

@end

覆盖原有的方法: 

-(UIBarButtonItem *)backBarButtonItem{

    return [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStyleBordered target:nil action:NULL];

}

这种方式乍一看可以达到目的,运行起来看也是那么回事,但是如果你在某个vc里面用:

self.navigationItem.backBarButtonItem

想取得backBarButtonItem然后修改默认title的话,就不行了,这样一来就违背了我们使用类别的初衷:不影响原有的代码及使用方式。
接下来我们使用Swizzling。首先添加load方法交换实现:

+(void)load{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

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

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

        method_exchangeImplementations(originalMethodImp, destMethodImp);

    });

}

objective c的运行时编程是非常强大的,这里我们仅仅只是交换一下两个方法的实现而已,接下来实现myCustomBackButton_backBarButtonItem(为了防止命名冲突,一般我们会这么命名)。

在此之前,我们需要知道,vc的navigationItem.backBarButtonItem默认是nil的,而且只有在nil的时候,系统才会把vc的title当作后退文字来使用:

static char kCustomBackButtonKey;

-(UIBarButtonItem *)myCustomBackButton_backBarbuttonItem{

    UIBarButtonItem *item = [self myCustomBackButton_backBarbuttonItem];

    if (item) {

        return item;

    }

    item = objc_getAssociatedObject(self, &kCustomBackButtonKey);

    if (!item) {

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

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

    }

    return item;

}

第一行访问self的myCustomBarButton_backBarButtonItem其实是访问原始的backBarButtonItem,这么做的目的是针对vc自己对navigationItem.backBarButtonItem赋值的情况,如果不加上这个处理的话,vc自己对navigationItem.backBarButtonItem的自定义就会被忽略掉,我们需要保证:默认情况下就是只显示箭头而不带文字,如果有某个vc自己对backBarButtonItem赋值的话,就按vc自定义的来显示,这样我们才能总是得到真正想要的item。

我们用对象关联把self和item关联起来,用的时候直接取即可。最后可以加上:

- (void)dealloc {

    objc_removeAssociatedObjects(self);

}

UPDATED:

忘记了很重要的一点:要导入<objc/runtime.h>

时间: 2024-12-26 10:05:31

iOS 全局修改UINavigation 后退按钮的相关文章

iOS运用runtime全局修改UILabel的默认字体

iOS运用runtime全局修改UILabel的默认字体 一.需求背景介绍         在项目比较成熟的基础上,遇到了这样一个需求,应用中需要引入新的字体,需要更换所有Label的默认字体,但是同时,对于一些特殊设置了字体的label又不需要更换.乍看起来,这个问题确实十分棘手,首先项目比较大,一个一个设置所有使用到的label的font工作量是巨大的,并且在许多动态展示的界面中,可能会漏掉一些label,产生bug.其次,项目中的label来源并不唯一,有用代码创建的,有xib和story

AJAX:如何处理书签和后退按钮

ajax|按钮|书签 本文将展示一个开源JavaScript库,该脚本库给AJAX应用程序带来了书签和后退按钮支持.在学习完这个教程后,开发人员将能够获得对一个AJAX问题的解决方案(甚至连Google Maps和Gmail现在都不提供该解决方案):一个强大的.可用的书签和后退前进功能,其操作行为如同其他的Web应用程序一样. 简单示例下载完整源代码.示例二下载O'Reilly Mail源代码. 本文将阐述目前AJAX应用程序在使用书签和后退按钮方面所面临的严重问题:展示Really Simpl

如何使用Ajax解决书签和后退按钮失效问题

本文将展示一个开源JavaScript库,该脚本库给AJAX应用程序带来了书签和后退按钮支持.在学习完这个教程后,开发人员将能够获得对一个AJAX问题的解决方案(甚至连Google Maps和Gmail现在都不提供该解决方案):一个强大的.可用的书签和后退前进功能,其操作行为如同其他的Web应用程序一样. 本文将阐述目前AJAX应用程序在使用书签和后退按钮方面所面临的严重问题:展示Really Simple History(RSH)库--一个可以解决以上问题的开源框架,并提供几个运行中的例子.

IOS 改变导航栏返回按钮的标题

  IOS 改变导航栏返回按钮的标题   下午又找到了一个新的方法 这个方法不错 暂时没有发现异常的地方.    新写的App中需要使用UINavigationController对各个页面进行导航,但由于第一级页面的title较长,在进入第二级页面后返回按钮leftButtonItem的title就会变得很长,对NavigationBar空间占用很大,而且不美观,于是使用代码对leftButtonItem的title文本进行修改,无论是设置self.navigationItem.leftBar

UWP-标题栏”后退“按钮

原文:UWP-标题栏"后退"按钮 标题栏"后退"按钮,系统级导航 应用必须启用所有硬件和软件系统后退按钮的后退导航.执行此操作的方法是注册 BackRequested 事件的侦听器并定义相应处理程序. 在此处我们为 App.xaml 代码隐藏文件中的 BackRequested 事件注册全局侦听器.如果你想要从后退导航排除特定页面,或想要在显示页面前执行页面级别代码,可以在每个页面中注册此事件. Windows.UI.Core.SystemNavigationMan

IOS UITableViewCell详解及按钮点击事件处理实例_IOS

IOS UITableViewCell详解及按钮点击事件处理 今天突然做项目的时候,又遇到处理自定义的UITableViewCell上按钮的点击事件问题.我知道有两种方式,可是突然想不起来之前是怎么做的了,好记性不如烂笔头,还是记录一下吧. 1.第一种方式给Button加上tag值 这里分为两种:一种是直接在原生的UITableViewCell上添加UIButton按钮,然后给UIButton设置tag值,然后在控制器里的方法里通过取数据,做界面跳转等.还是举个例子吧,省的回忆半天. - (UI

《天天连萌》iOS破解修改金币图文攻略

<天天连萌>是一款轻松休闲的掌上游戏.据透露,它在<天天爱消除> 的基础上进一步发扬光大的极简主义与超萌风格,是这款游戏最吸引人的地方.下面就给大家分享一个iOS天天连萌修改金币攻略,破解金币内购轻松修改.参照此教程,玩家完全不用担心金币不够用,每局都可以放心的使用道具.下面是修改攻略的具体步骤.1.确定自己的设备是已越狱设备(能找到下图红框内的软件就说明是已越狱软件了).2.安装八门神器[安装八门神器教程]3.打开八门神器,在其中输入当前的金币数量,选择自动搜索,可以看到现在的搜

IE浏览器前进后退按钮的那些事

浏览器上的前进与后退按钮作为使用频率最高的功能之一,IE团队在设计IE9界面时,便对这两个按钮做了很多优化细节处理. 比如从视觉上看,后退按钮要比前进按钮大的多,点击更为方面,那为什么要这么设计呢?原来微软在对用户使用浏览器的习惯进行大量调查后发现,用户平时点击后退按钮的频率比前进按钮要大得多. 按钮除了在视觉上的优化,功能上也花了不少心思.你知道吗?IE浏览器上的前进与后退键可不仅仅只能点一次噢~将历史记录结合后的按钮更在乎您的使用习惯.下面三种方式告诉你小小的一个按钮也可以有这么多精心的设计

一键调出IE10常用菜单栏和前进后退按钮

大家都有升级到 Windows 8 呢?有没有体验 IE10 革新的无边框全屏浏览呢?想尽情享受网页浏览的酣畅淋漓?其实很简单,今天,小编教大家4步哦,彻底摆脱菜单按钮束缚,轻松玩转 IE10!学起来吧~ 第一步:一键调出常用菜单栏 在享受无边框全屏浏览的同时,却不知道该如何调出常用菜单栏?别担心,其实,只需一键,就可以轻松搞定! 右键调出常用菜单栏 在网页空白处单击鼠标右键或使用 Windows + z,Metro 版 IE10 的常用操作就会在屏幕顶部和底部的菜单栏中显示出来.你可以在屏幕顶