【问题标题】:is there a shortcut to know, when I'm running my app, which view controller am I in?有没有捷径可以知道,当我运行我的应用程序时,我在哪个视图控制器中?
【发布时间】:2019-05-15 14:12:39
【问题描述】:

我正在开发一个已经存在的应用程序,我想运行该应用程序并在输出中知道我在哪个视图控制器中,而不是去每个类和视图控制器并打印它的名称。有什么捷径可以帮到我吗??

我已经尝试在每个 ViewController 中加载视图中的打印

喜欢

print("view did load : MainViewController") 

但我发现这是浪费时间,因为我有太多的视图控制器。 我考虑调试,但我真的不知道它是做什么的或如何。

【问题讨论】:

  • 您也可以继承 UIViewController 并覆盖 viewDidLoad 方法。但是,您必须将所有视图控制器更改为该自定义 vc。
  • 恕我直言,一些“警告警报”正在阅读您的问题。为什么“这么多视图控制器”?这似乎是一个设计问题。 (我更喜欢听到“这么多视图”。此时“使用哪个视图”的问题要容易得多。)通常,除非你有“这么多 child viewControllers”,否则你真的有一个 - 根 - VC。同样,这似乎是一个设计问题。最后 为什么你需要知道这个? (是的,再一次,在我看来,这似乎是一个设计问题。你能提供更多细节吗?谢谢。

标签: ios swift swift4.2


【解决方案1】:

您可以调配(交换)UIViewController.viewDidAppear 的实现,以便打印类名。首先定义你的 swizzled 实现:

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 实现结束时调用原始实现。它看起来像一个递归调用,但它不是。希望对您有所帮助。

【讨论】:

    【解决方案2】:

    我不确定这是否可能。但是,为了让它更简单一点,您可以做的是将此扩展添加到 UIViewController

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

    然后,在viewDidLoad 中打印:

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

    【讨论】:

    • 是的,但还是一样,我需要去每个 viewController 并编写这段代码。我想要一些可以拯救这一切的东西。甚至可以打印我的功能。我想知道我在代码中使用应用程序所做的每一步
    • 是的,但是您可以通过代码替换来完成,然后分批完成。所以找到super.viewDidLoad() 并将其替换为super.viewDidLoad(); print(self.className)。然后按全部替换。不理想,但有效?
    • 很抱歉,我正在寻找另一种解决方案,可以帮助我节省时间。我已经说过我知道这个解决方案,但我正在寻找另一个。还是谢谢你
    • 如果没有更好的,你可以回到这个:)
    猜你喜欢
    • 1970-01-01
    • 2021-11-16
    • 2020-01-28
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多