Как исключить UIViewControllers, кроме представлений, из метода Swizzle?

Я пытаюсь переопределить методы viewDidAppear() моих пользовательских ViewController, и я нашел решение, используя метод swizzle. Это работает, но когда клавиатура видна, мой метод также собирает Keyboard UIViewControllers, например;

          UIInputWindowController
    UICompatibilityInputViewController
    UISystemKeyboardDockController
    UIInputWindowController
    UICompatibilityInputViewController
    UICompatibilityInputViewController
    UISystemInputAssistantViewController
    UIPredictionViewController
    UISystemKeyboardDockController

Интересно, как я могу исключить все UIViewController, кроме моих пользовательских ViewController? Я могу исключить те UIViewControllers, с которыми я сталкивался до сих пор, но я думаю, что в будущем будут другие UIViewControllers. Думаю, мне нужно универсальное решение.

Мой код выглядит следующим образом:

      extension UIViewController {
    @objc func viewDidApperOverride(_ animated: Bool) {
        self.viewDidApperOverride(animated)
        print(NSStringFromClass(type(of: self)))  
    }

    static func swizzle() {
        if self != UIViewController.self {
            return
        }
        
        let originalSelector = #selector(UIViewController.viewDidAppear(_:))
        let swizzledSelector = #selector(UIViewController.viewDidApperOverride(_:))
        guard let originalMethod = class_getInstanceMethod(self, originalSelector),
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) else { return }
        method_exchangeImplementations(originalMethod, swizzledMethod)
    }
}

1 ответ

Вы можете просто игнорировать каждый ViewController, имя класса которого начинается с «UI» или «_». Вы можете получить строку имени класса VC с помощью type(of: self).description().

Другие вопросы по тегам