我正在开发一个已经存在的应用程序,我想运行该应用程序并在输出中知道我在哪个视图控制器中,而不必转到每个类和viewController并打印其名称。有捷径或其他可以帮助我的东西吗?
我尝试在视图中打印的确加载到每个ViewController中
喜欢
val ref : (A) -> T = ::MainViewModel
val ref : (A) -> T = { MainViewModel(it) } // or: = { anA : A -> MainViewModel(anA) }
但是我发现这浪费时间,因为我有很多viewControllers。 我考虑调试,但我真的不知道它能做什么或如何。
答案 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 {
仍然不理想,但也可以工作:)