есть ли ярлык, чтобы знать, когда я запускаю свое приложение, в каком контроллере представления я нахожусь? - PullRequest
2 голосов
/ 15 мая 2019

Я работаю над приложением, которое уже существует, и я хочу запустить приложение и узнать в выводе, в каком контроллере представления я нахожусь, не обращаясь к каждому классу и viewController и не печатая его имя.Есть ли ярлык или что-то, что может мне помочь ??

Я пробовал печатать в виде, загружался в каждый ViewController

как

print("view did load : MainViewController") 

, но я нашел этопотеря времени, потому что у меня так много viewControllers.Я думаю об отладке, но я действительно не знаю, что она делает и как.

Ответы [ 2 ]

3 голосов
/ 15 мая 2019

Вы можете swizzle (обменять реализацию) UIViewController.viewDidAppear, чтобы он печатал имя класса. Сначала определите вашу изворотливую реализацию:

extension UIViewController {
    @objc func printingViewDidAppear(_ animated: Bool) {
        print(String(describing: type(of: self)))

        // Call the original implementation.  This looks like recursion but isn't
        printingViewDidAppear(animated)
    }
}

Затем замените реализацию по умолчанию на вашу реализацию следующим образом:

let originalViewDidAppear: Method = class_getInstanceMethod(UIViewController.self, #selector(UIViewController.viewDidAppear(_:)))!

let swizzledViewDidAppear: Method = class_getInstanceMethod(UIViewController.self, #selector(UIViewController.printingViewDidAppear(_:)))!

method_exchangeImplementations(originalViewDidAppear, swizzledViewDidAppear)

Таким образом, вам не нужно менять ни один из существующих контроллеров представления.

Вы должны обязательно вызвать исходную реализацию в конце реализации swizzled. Это похоже на рекурсивный вызов, но это не так. Надеюсь, это поможет.

1 голос
/ 15 мая 2019

Я не уверен, что это возможно.Однако, чтобы сделать его немного проще, можно добавить это расширение к UIViewController:

extension UIViewController {
    var className: String {
        return String(describing: type(of: self))
    }
}

Затем в viewDidLoad выведите его:

print("loaded \(self.className)")
...