0
Ich möchte viewDidLoad
in einer UIViewController
Erweiterung swizzle aber initialize()
Methode, die in swift3
überschrieben wurde und funktionierte wird nicht von swift4
unterstützt. Kann mir irgendjemand eine Lösung geben? Mein Code in swift3
war wie folgt.Wie swipe ViewDidLoad Methode in UIViewController in Swift 4? initialize() ist veraltet in swift 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)
}
}
und haben eine globale Methode
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)
}
}
Könnten Sie bitte erklären, warum Sie in erster Linie swizzle wollen? Normalerweise bedeutet es, dass Sie etwas sehr falsches tun ... – Sulthan
Verstehst du, dass das, was du versuchst zu tun, eine sehr komplizierte Art ist, eine sehr einfache Sache zu machen, die mit einer Unterklasse erreicht werden kann? Z.B. Unterklasse 'UINavigationController', um alle Backbutton-Titel auf seinem Controller auszublenden und dann nur Ihre Unterklasse anstelle von' UINavigationController' zu verwenden? – Sulthan
Ich versuche, ein vorhandenes Projekt in swift 4 zu konvertieren, also wenn ich 'UINavigationController' ableiere, muss ich in vielen Klassen im Projekt ändern. Aber danke für den Vorschlag, dass dies meine alternative Lösung sein wird, wenn Swizzling nicht funktioniert. – Soumen