我有一个单例存储我的macOS应用程序的一些全局数据,我的一个ViewController不断修改数据。我想同时显示与另一个ViewController相关的View中的更改。最好的方法是什么?
全局数据:
final class AppData {
static var logs: [LogData] = []
}
ViewController 1:
class FirstViewController: NSViewController {
AppData.logs.append(newLogData)
}
ViewController 2:
class SecondViewController: NSViewController {
// what's the best way to simultaneously watch the change of AppData.logs?
}
答案 0 :(得分:1)
如果您的应用仅计划为macOS,则可以使用NSObjectController。这绝对是最简单的方法,您可以在“接口”构建器中进行大多数配置。它在内部与绑定一起使用。如果要观察数组,可以使用NSArrayController。
答案 1 :(得分:0)
一种方法是使用通知中心
在viewcontroller2中添加:
override func viewDidLoad() {
super.viewDidLoad()
notificationCenter.default.addObserver(self,
selector: #selector(view1DidChange),
name: "view1DidChange",
object: nil
)
}
@objc private func view1DidChange(_ notification: Notification) {
// Do something
}
在viewcontroller1中添加
notificationCenter.default.post(name: "view1DidChange", object: self)
这可以在每个应该听的课上重复。
答案 2 :(得分:0)
在这里,我分享了“代理和协议”方法来实现此功能。
final class AppData {
static var logs: [LogData] = []
}
protocol FirstViewControllerDelegate {
func ViewControllerDelegate(appData:[LogData])
}
class FirstViewController: NSViewController {
var delegate:FirstViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
AppData.logs.append(newLogData)
self. delegate?.ViewControllerDelegate(appData: AppData.logs)
}
}
class SecondViewController: NSViewController,FirstViewControllerDelegate {
var firstViewController:FirstViewController = FirstViewController()
override func viewDidLoad() {
self.firstViewController.delegate = self
}
func ViewControllerDelegate(appData:[LogData]){
//Do Update the UI
}
}