有什么捷径可以知道,当我运行我的应用程序时,我在哪个视图控制器中?

时间:2019-05-15 14:12:40

标签: ios swift swift4.2

我正在开发一个已经存在的应用程序,我想运行该应用程序并在输出中知道我在哪个视图控制器中,而不必转到每个类和viewController并打印其名称。有捷径或其他可以帮助我的东西吗?

我尝试在视图中打印的确加载到每个ViewController中

喜欢

val ref : (A) -> T = ::MainViewModel
val ref : (A) -> T = { MainViewModel(it) } // or: = { anA : A -> MainViewModel(anA) }

但是我发现这浪费时间,因为我有很多viewControllers。 我考虑调试,但我真的不知道它能做什么或如何。

3 个答案:

答案 0 :(得分:3)

您可以打扰(交换实现)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)

那样,您将不需要更改任何现有的视图控制器。

您必须确保在混乱的实现结束时调用原始实现。它看起来像递归调用,但不是。希望有帮助。

答案 1 :(得分:1)

我不确定是否可以。但是,为了使其更简单,您可以做的就是将此扩展名添加到[40, 40, 40, 60, np.nan, 70, 80, np.nan, np.nan]

UIViewController

然后在extension UIViewController { var className: String { return String(describing: type(of: self)) } } 中进行打印:

viewDidLoad

答案 2 :(得分:0)

您可以继承UIViewController的子类,然后像这样覆盖viewDidLoad

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        print("loaded \(self.className)")
    }
}

再次使用此扩展程序:

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

然后,您必须将所有视图控制器声明从myVC: UIViewController更改为:

class MyViewController: ViewController {

仍然不理想,但也可以工作:)