如何在标签栏控制器之间传输数组变量?

How to transfer array variables between tab bar controllers?

我正在尝试了解视图控制器的生命周期。我需要使用 TabBar 来切换控制器。当切换控制器时,我需要标签来显示生命周期方法,不仅是我现在找到的控制器,还有其他控制器。

我创建了一个空数组private var arrayOfMethods = [String](),我每次都在其中添加一个触发方法。

class ViewController: UIViewController {

    private var arrayOfMethods = [String]()

    @IBOutlet var greenLabel: UILabel!
    @IBOutlet var blueLabel: UILabel!
    @IBOutlet var yellowLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        printMessage()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        printMessage()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        printMessage()
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        printMessage()
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        printMessage()
    }

    func printMessage(line: Int = #line, function: String = #function) {
        print("\(title ?? "nil"). Line: \(line) of function \(function)")
        arrayOfMethods.append(function)
        let string = arrayOfMethods.joined(separator: "\n")
        greenLabel.text = "\(title ?? "nil") \(string)"
    }
}

您可以创建一个公共 class 并从您的所有视图控制器调用它的函数

 class Helper: NSObject {

    private var arrayOfMethods = [String]()
    static let shared = Helper()
    let mainLabel = UITextView(frame: CGRect(x: 100, y: 100, width: 300, height: 300))

    private override init() {
        super.init()
    }

    func printMessage(vc: UIViewController, line: Int = #line, function: String = #function) {
        print("\(vc.title ?? "nil"). Line: \(line) of function \(function)")
        arrayOfMethods.append( (vc.title ?? "nil") + "-" + function)
        let string = arrayOfMethods.joined(separator: "\n")

        guard let window = UIApplication.shared.keyWindow else { return }

        if !window.subviews.contains(mainLabel) {
            window.addSubview(mainLabel)
            window.bringSubviewToFront(mainLabel)
        }
        mainLabel.text = string
    }
}

然后像这样从所有视图控制器调用这个单例 class 方法

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        Helper.shared.printMessage(vc: self)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        Helper.shared.printMessage(vc: self)
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        Helper.shared.printMessage(vc: self)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        Helper.shared.printMessage(vc: self)
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        Helper.shared.printMessage(vc: self)
    }
}

输出