0
我想調整viewDidLoad
在UIViewController
擴展名,但initialize()
方法被覆蓋在swift3
和正在工作不支持swift4
。任何人都可以給我任何解決方案嗎?我在swift3
的代碼如下。如何在swift 4中在UIViewController中調用viewDidLoad方法?初始化()在快速棄用4
extension UIViewController {
open override class func initialize() {
guard self === UIViewController.self else { return }
swizzling(self)
}
// MARK: - Method Swizzling
func nsh_viewDidLoad() {
self.nsh_viewDidLoad()
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)
}
}
,並有一個全球性的方法
private let swizzling: (UIViewController.Type) ->() = { viewController in
let originalSelector = #selector(viewController.viewDidLoad)
let swizzledSelector = #selector(viewController.nsh_viewDidLoad)
let originalMethod = class_getInstanceMethod(viewController, originalSelector)
let swizzledMethod = class_getInstanceMethod(viewController, swizzledSelector)
let didAddMethod = class_addMethod(viewController, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
if didAddMethod {
class_replaceMethod(viewController, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
} else {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
能否請您解釋一下爲什麼你要在第一時間到調酒?通常這意味着你正在做一些非常錯誤的事情...... – Sulthan
你是否明白你所要做的是一種非常複雜的方式來做一個非常簡單的事情,可以使用一個子類來實現?例如。 UINavigationController的子類化來隱藏其控制器上的所有後退按鈕標題,然後使用你的子類而不是'UINavigationController'? – Sulthan
我想將現有項目轉換爲swift 4,所以如果我繼承了'UINavigationController',我需要在項目中的許多類中進行更改。但是謝謝你的建議,如果攪拌不起作用,這將是我的替代解決方案。 – Soumen