如何一劳永逸的隐藏Navigation返回按钮的标题

 我来答
优就业张老师
2017-06-16 · TA获得超过1036个赞
知道小有建树答主
回答量:441
采纳率:88%
帮助的人:94.9万
展开全部

网上有很多的去标题的解决方案,方法各种各样还不尽相同,但是都需要在每个ViewController的viewWillAppear或者是viewDidLoad等方法中去掉标题。

那么,有没有一劳永逸的方法呢?只写一次整个工程都可以生效,答案是肯定的。实现思路十分简单,首先扩展UIViewController,然后使用RunTime的黑魔法交换系统viewWillAppear方法的实现,最后在自定义的custom_viewWillAppear中去掉返回按钮的标题。(当然,也可以使用基类派生的形式来解决这样的问题)

大致实现如下:

// 代码运行环境:Xcode8.0,Swift3.0
// 如果使用swift2.0+,只需要修改部分代码即可。
import UIKit
extension UIViewController {
    open override class func initialize() {
        guard self === UIViewController.self else {
            return
        }
        // if using swift2.0+
        /*
        struct Static {
            static var onceToken: dispatch_once_t = 0
        }
        dispatch_once(&Static.onceToken) {
            replaceViewWillAppear()
        }
         */
        // if using swift3.0+
        let dispatchOnce: Void = {
            replaceViewWillAppear()
        }()
        _ = dispatchOnce
    }
    // 替换系统的 ViewWillAppear
    private class func replaceViewWillAppear() {
        let originSel = #selector(UIViewController.viewWillAppear(_:))
        let swizzlSel = #selector(UIViewController.cgy_viewWillAppear(_:))
        let originMethod = class_getInstanceMethod(self, originSel)
        let swizzlMethod = class_getInstanceMethod(self, swizzlSel)
        let addMethod = class_addMethod(self, originSel,
                                        method_getImplementation(swizzlMethod),
                                        method_getTypeEncoding(swizzlMethod))
        if addMethod {
            class_replaceMethod(self, swizzlSel,
                                method_getImplementation(originMethod),
                                method_getTypeEncoding(originMethod))
        } else {
            method_exchangeImplementations(originMethod, swizzlMethod)
        }
    }
    func cgy_viewWillAppear(_ animated: Bool) {
        self.cgy_viewWillAppear(animated)
        self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "",
                                                                style: .plain,
                                                                target: nil,
                                                                action: nil)
    }
}

当然,不只是隐藏标题,比如可以自定义返回按钮等等……

中智咨询
2024-08-28 广告
在当今竞争激烈的商业环境中,企业需要不断提高自身的竞争力,以保持市场份额和增加利润。通过人效提升,企业可以更有效地利用有限的资源,提高生产力和效益,从而实现盈利目标。中智咨询提供全方位的组织人效评价与诊断、人效提升方案等数据和管理咨询服务。... 点击进入详情页
本回答由中智咨询提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式