2017-10-17 2 views
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) 
    } 
} 
+0

Könnten Sie bitte erklären, warum Sie in erster Linie swizzle wollen? Normalerweise bedeutet es, dass Sie etwas sehr falsches tun ... – Sulthan

+2

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

+0

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

Antwort

2

ich den Code unten in AppDelegate hinzugefügt statt, wenn Swizzling

let barButtonItemAppearance = UIBarButtonItem.appearance() 
     barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .normal) 
     barButtonItemAppearance.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.clear], for: .highlighted)