我有一个标签栏控制器,其中包含两个视图控制器。我想将数据从第一个视图控制器传递给第二个。我目前正在使用单例方法:
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
}
}
这不是理想的,由于性能原因,我只想在将新值添加到数组时获取。如何添加侦听器,以便仅在应用程序将新元素添加到数组时才获取?
答案 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
}
...
}