Как исключить 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()
.