在选项卡控制器中的两个视图控制器之间传递数据

时间:2018-12-11 08:20:18

标签: ios swift

我有一个标签栏控制器,其中包含两个视图控制器。我想将数据从第一个视图控制器传递给第二个。我目前正在使用单例方法:

class Items {
    static let shared = Items()
    var array = [Item]()
}

第一个视图控制器负责填充共享数组。

class FirstiewController: UIViewController {
   func appendElement() {
       let newItem = Item()
       Items.shared.array.append(newItem)
   }
}

每次在屏幕上显示视图时,第二个视图控制器应该检索数组。

class SecondViewController: UIViewController {

    internal var items: [Item] = []

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        items = Items.shared.array
    }
}

这不是理想的,由于性能原因,我只想在将新值添加到数组时获取。如何添加侦听器,以便仅在应用程序将新元素添加到数组时才获取?

1 个答案:

答案 0 :(得分:2)

使用委托模式

为您的Items类首先创建协议

protocol ItemsDelegate {
    func newItemAdded()
}

然后在Items类中为您的委托创建变量,并在array的新值设置好后在委托上调用方法

class Items {

    var delegate: ItemsDelegate?

    static let shared = Items()
    var array = [Item]() {
        didSet {
           delegate?.newItemAdded()
        }
    }

}

然后在viewDidLoad中将单例的委托设置为self

override func viewDidLoad() {
    ...
    Items.shared.delegate = self
}

然后在您的ViewController中实现此协议,并声明添加新项目时应该发生的情况

class SecondViewController: UIViewController, ItemsDelegate {
    ...
    func newItemAdded() {
        items = Items.shared.array
    }
    ...
}