Sobes.tech
Junior — Middle

Jak można śledzić wywołania metody viewDidLoad we wszystkich instancjach kontrolerów w aplikacji?

sobes.tech AI

Odpowiedź od AI

Aby śledzić wywołania metody viewDidLoad we wszystkich instancjach kontrolerów w iOS, można użyć metody swizzling — dynamicznej zamiany implementacji metody w czasie działania.

Przykład w Swift:

import UIKit

extension UIViewController {
    static let swizzleViewDidLoad: Void = {
        let originalSelector = #selector(viewDidLoad)
        let swizzledSelector = #selector(swizzled_viewDidLoad)

        guard let originalMethod = class_getInstanceMethod(UIViewController.self, originalSelector),
              let swizzledMethod = class_getInstanceMethod(UIViewController.self, swizzledSelector) else { return }

        method_exchangeImplementations(originalMethod, swizzledMethod)
    }()

    @objc func swizzled_viewDidLoad() {
        // Wywołanie oryginalnej metody (teraz swizzled_viewDidLoad)
        swizzled_viewDidLoad()

        // Logowanie lub inna logika
        print("viewDidLoad wywołano dla \(type(of: self))")
    }
}

// Wywołać swizzling raz, na przykład w AppDelegate
UIViewController.swizzleViewDidLoad

Ten sposób pozwala przechwycić wywołania viewDidLoad dla wszystkich kontrolerów bez zmiany ich kodu źródłowego.