如何一劳永逸的隐藏Navigation返回按钮的标题
1个回答
展开全部
网上有很多的去标题的解决方案,方法各种各样还不尽相同,但是都需要在每个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 广告
2024-08-28 广告
在当今竞争激烈的商业环境中,企业需要不断提高自身的竞争力,以保持市场份额和增加利润。通过人效提升,企业可以更有效地利用有限的资源,提高生产力和效益,从而实现盈利目标。中智咨询提供全方位的组织人效评价与诊断、人效提升方案等数据和管理咨询服务。...
点击进入详情页
本回答由中智咨询提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询